如何将参数传递给 express 中的回调函数?
How to pass arguments to a callback function in express?
我正在使用 Express 中间件和 NodeJS。我组织了没有回调的路由,但对于其中一些路由,最好是相互函数化,所以我开始写一些回调。
例如我有这个函数(我没有把整个代码放在这里,它对我的问题没用):
async function verification(req, res, next) {
我在路由部分是这样使用的:
router.post('/item/:id/dosomething',
verification,
async (req, res) => {
一切正常,但如果我想继续使用回调(有时使用干净高效的代码是一个很好的解决方案),我将不得不向函数传递一些参数。我当然试过了,但没用:
router.post('/item/:id/dosomething',
verification(arg1, arg2),
async (req, res) => {
我在 Whosebug 上搜索了“将参数传递给回调函数”的答案,但有几个有趣的答案谈到了包装函数,我认为我无法在我的案例中实现它。
如果有人能帮助我,那就太好了。谢谢:)
下面是一个 next
在不将其写入调用的情况下如何工作的片段(查看 verif
):
回调:
async function verif(req, res, next) {
let rows;
const {
id
} = req.params;
({ rows } = await db.query(`XXX`))
if (rows.length === 1) {
return next();
} else {
retour(req, res, 500, "No can do.");
}
在哪里叫:
router.post('/mymusic/:id/addElements',
droits.verifRightsCB.bind(undefined, 'music', 'addInMyMusic'),
verif,
async (req, res) => {...
路由的最后一部分(async (req, res) =>
)仅在verif
中满足next()
条件时执行,尽管我没有传递任何参数。
function verification(arg1, arg2, req, res, next) {...}
router.post('/item/:id/dosomething',
verification.bind(undefined, arg1, arg2),
(req, res) => {...}
(函数不必是async
。)
请注意,router.post
语句是在服务器启动期间执行的,而不是每个请求。因此你不能写类似
的东西
router.post('/item/:id/dosomething',
verification.bind(undefined, arg1, req.params.arg),
(req, res) => {...}
因为服务器启动时没有req
。相反,你可以写
router.post('/item/:id/dosomething',
(req, res, next) => verification(arg1, req.params.arg, req, res, next),
(req, res) => {...}
verification
函数可以
- 验证成功后调用
next()
调用其他中间件功能((req, res) => {...}
)
- 或者在验证错误后调用
next(err)
以跳过其他中间件功能并报告错误。
我正在使用 Express 中间件和 NodeJS。我组织了没有回调的路由,但对于其中一些路由,最好是相互函数化,所以我开始写一些回调。
例如我有这个函数(我没有把整个代码放在这里,它对我的问题没用):
async function verification(req, res, next) {
我在路由部分是这样使用的:
router.post('/item/:id/dosomething',
verification,
async (req, res) => {
一切正常,但如果我想继续使用回调(有时使用干净高效的代码是一个很好的解决方案),我将不得不向函数传递一些参数。我当然试过了,但没用:
router.post('/item/:id/dosomething',
verification(arg1, arg2),
async (req, res) => {
我在 Whosebug 上搜索了“将参数传递给回调函数”的答案,但有几个有趣的答案谈到了包装函数,我认为我无法在我的案例中实现它。
如果有人能帮助我,那就太好了。谢谢:)
下面是一个 next
在不将其写入调用的情况下如何工作的片段(查看 verif
):
回调:
async function verif(req, res, next) {
let rows;
const {
id
} = req.params;
({ rows } = await db.query(`XXX`))
if (rows.length === 1) {
return next();
} else {
retour(req, res, 500, "No can do.");
}
在哪里叫:
router.post('/mymusic/:id/addElements',
droits.verifRightsCB.bind(undefined, 'music', 'addInMyMusic'),
verif,
async (req, res) => {...
路由的最后一部分(async (req, res) =>
)仅在verif
中满足next()
条件时执行,尽管我没有传递任何参数。
function verification(arg1, arg2, req, res, next) {...}
router.post('/item/:id/dosomething',
verification.bind(undefined, arg1, arg2),
(req, res) => {...}
(函数不必是async
。)
请注意,router.post
语句是在服务器启动期间执行的,而不是每个请求。因此你不能写类似
router.post('/item/:id/dosomething',
verification.bind(undefined, arg1, req.params.arg),
(req, res) => {...}
因为服务器启动时没有req
。相反,你可以写
router.post('/item/:id/dosomething',
(req, res, next) => verification(arg1, req.params.arg, req, res, next),
(req, res) => {...}
verification
函数可以
- 验证成功后调用
next()
调用其他中间件功能((req, res) => {...}
) - 或者在验证错误后调用
next(err)
以跳过其他中间件功能并报告错误。