itty
在使用 itty 时,我们需要按照官方的类型定义来编写代码。
- withContent、withParams
当我们使用 form body 和 path params 时,我们需要使用 withContent 和 withParams 来定义参数。
使用以后,我们还需要联合 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}`)
})