我正在尝试构建一个参数中间件,它会加载请求的object
并将其附加到request
对象上,这样我就不必反复编写相同的代码了。
我正在使用ORM来访问MySQL数据库,所选ORM是基于Promise的(bluebird
),具体而言是Sequelize
。
下面是示例代码:
router.param('id', function (req, res, next, id) {
return models.Object.findById(id)
.then((object) => {
//Check if the requested object was found
if (object) {
//Append the request object to the request object
//for further usage in upcoming route handlers
req.object = object
return next()
} else {
//Throw an error, so that it can be caught
//by the catch block of the promise chain
let err = new Error('Object not found.')
err.status = 404
throw err
}
})
//Catch any error and forward it to the
//next express error handler
.catch((err) => { return next(err) })
})
如您所见,我正在检查请求的对象是否存在,如果存在,则将其附加到express的请求对象中。如果不存在,则会抛出错误。 当我运行此代码时,会收到警告:
Warning: a promise was created in a handler at /*path goes here*/ but was not returned from it
。
此时我真的不知道如何消除这个错误。
编辑:
我尝试了Hosar的解决方案,但不幸的是仍然会出现警告。这是我使用的确切代码:
router.param('aId', function (req, res, next, aId) {
models.Authorization.findById(aId)
.then((authorization) => {
if (authorization) {
req.authorization = authorization
next()
} else {
let err = new Error('Not Found')
err.status = 404
next(err)
}
})
.catch((err) => { return next(err) })
})
错误发生在我想要调用没有任何参数的next()函数的那一行代码上。
完整的警告信息如下:
(node:5504) 警告:在C:\Users\dkaiser\repos\lead\lead_backend\routes\auth.js的第10行16列处的处理程序中创建了一个promise,但未从其中返回。