记住中间件架构:每个处理程序都可以操作上下文,并且要么响应,要么调用
next()
。
按照这个前提,Express路由器基本上是一个中间件函数,您可以在“修正”URL后使用它。
(顺便说一下,请求应用程序也是一个函数,尽管我不确定是否建议在链条的早期返回)
以下是一个示例:
const router = new require('express').Router()
const user = require('../model/user')
//assume user implements:
// user.byId(id) -> Promise<user>
// user.byMail(email) -> Promise<user>
const reqUser = userPromise => (req, res, next) =>
req.user
? next()
: userPromise(req)
.then(user => { req.user = user })
.then(next, next)
//assume the sever that uses this router has a
//standard (err, req, res, next) handler in the end of the chain...
const byId = reqUser( req => user.byId(req.params.id) )
const byMail = reqUser( req => user.byMail(req.params.mail) )
router.post('/by-id/:id/friends',
byId,
(req, res) => res.render('user-friends', req.user)
)
router.post('/by-email/:email/friends',
byMail,
(req, res, next) => {
req.url = `/by-id/${req.user.id}/friends`
next()
},
router
)
/
的 {GET} 请求重定向到/test
的 {POST} 请求。 - Samuel Toh