文档生成
框架支持
itty 支持进度 70%

itty

在使用 itty 时,我们需要按照官方的类型定义来编写代码。

  1. withContent、withParams

当我们使用 form body 和 path params 时,我们需要使用 withContentwithParams 来定义参数。 使用以后,我们还需要联合 IRequest 定义数据类型,需要注意的是 withParams 是 path 中的 params,而如果是 query params 则只需要定义类型即可。

请参考用例:

import { createServer } from 'node:http'
import type { IRequest } from 'itty-router'
import { AutoRouter, createResponse, status, withContent, withParams } from 'itty-router'
import { createServerAdapter } from '@whatwg-node/server'
import type {
  CreateUserRequest,
  GetUsersQuery,
  UpdateUserRequest,
  User,
} from './itty.pub'
import {
  UserRole,
} from './itty.pub'
 
const port = 996
const router = AutoRouter({})
 
// 模拟数据库
const users: User[] = []
 
router
  .get('/', () => {
    status(400)
    return createResponse(JSON.stringify({ success: true, message: 'Hello, World!' }))
  })
  .get<IRequest & { query: GetUsersQuery }>(
    '/users',
    ({ query }) => {
      let filteredUsers = users
 
      if (query.role) {
        filteredUsers = filteredUsers.filter(user =>
          user.role === query.role,
        )
      }
 
      const offset = query.offset || 0
      const limit = query.limit || filteredUsers.length
      const paginatedUsers = filteredUsers.slice(offset, offset + limit)
 
      /**
       * @define GetUsersResponse
       */
      return {
        success: true,
        data: paginatedUsers,
        total: filteredUsers.length,
      }
    },
  )
  .get<IRequest & { params: { id: string } }>(
    '/users/:id',
    withParams,
    ({ params }) => {
      const user = users.find(u => u.id === params.id)
 
      if (!user) {
        /**
         * @ignore
         */
        return { success: false, message: 'User not found' }
      }
 
      /**
       * @define GetUserResponse
       */
      return { success: true, data: user }
    },
  )
  .post<IRequest & { content: CreateUserRequest }>(
    '/users',
    withContent,
    ({ content }) => {
      if (!Object.values(UserRole).includes(content.role)) {
        /**
         * @ignore
         */
        return { success: false, message: 'Invalid user role' }
      }
 
      const id = Date.now().toString()
      const newUser: User = { id, ...content }
      users.push(newUser)
 
      /**
       * @define CreateUserResponse
       */
      return { success: true, data: newUser }
    },
  )
  .put<IRequest & { params: { id: string }, content: UpdateUserRequest }>(
    '/users/:id',
    withParams,
    withContent,
    ({ params, content }) => {
      const userIndex = users.findIndex(u => u.id === params.id)
 
      if (userIndex === -1) {
        /**
         * @ignore
         */
        return { success: false, message: 'User not found' }
      }
 
      if (content.role && !Object.values(UserRole).includes(content.role)) {
        /**
         * @ignore
         */
        return { success: false, message: 'Invalid user role' }
      }
 
      users[userIndex] = { ...users[userIndex], ...content }
 
      /**
       * @define UpdateUserResponse
       */
      return { success: true, data: users[userIndex] }
    },
  )
  .delete<IRequest & { params: { id: string } }>(
    '/users/:id',
    withParams,
    ({ params }) => {
      const userIndex = users.findIndex(u => u.id === params.id)
 
      if (userIndex === -1) {
        /**
         * @ignore
         */
        return { success: false, message: 'User not found' }
      }
 
      const deletedUser = users.splice(userIndex, 1)[0]
 
      /**
       * @define DeleteUserResponse
       */
      return { success: true, data: deletedUser }
    },
  )
 
const ittyServer = createServerAdapter(router.fetch)
 
const httpServer = createServer(ittyServer)
httpServer.listen(port, () => {
  console.log(`Listening on http://localhost:${port}`)
})