谁能解释为什么当我从第一个箭头函数中删除括号时代码会启动,但是当我再次添加括号时,出现此错误'Route.post()需要回调函数,但得到了[object Undefined] '
带方括号的代码:
module.exports = {
errorHandler: (fn) => {
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next)
}
}
}
不带括号的代码:
module.exports = {
errorHandler: (fn) =>
(req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next)
}
}
index.js路由
const express = require('express');
const { postRegister } = require('../controller');
const { errorHandler } = require('../middleware')
const router = express.Router();
/* GET home page. */
router.get('/', function(req, res, next) {
res.render('index', { title: 'Express' });
});
router.get('/register', (req, res, next) => {res.send('/register')});
router.post('/register', errorHandler(postRegister));
module.exports = router;
答案 0 :(得分:1)
上面两个例子不一样。您应该将语句return
添加到“带括号的代码”中。
带括号的代码:
module.exports = {
errorHandler: (fn) => {
return (req, res, next) => {
Promise.resolve(fn(req, res, next))
.catch(next)
}
}
}
另一个例子。
() => 2
与() => { return 2 }
答案 1 :(得分:1)
不带括号的块起作用的原因是因为errorHandler()
返回了express所要求的功能。带括号的块不起作用,因为errorHandler()
未返回与所需middleware function signature required by express匹配的函数。
Arrow functions如果存在=>
,则以不同的方式评估{
的右侧。
{
开始block statement,并且在使用Arrow Function右侧的块时,需要return
。
如果箭头功能的右侧未使用块,则右侧的求值将被视为表达式。然后,将表达式的结果作为函数的结果返回。
由于不带括号的块被视为表达式,因此当router.post('/register')
调用errorHandler()
时,将返回在=>
右侧定义的函数。
使用块语法定义errorHandler()
时,在表达需求的函数之前需要return
。在带有该块的示例中,errorHandler()
不返回任何中间件功能。当router.post('/register')
调用errorHandler()
时,不返回任何内容,从而导致错误。如果要使用块语法,则必须包括return
:
errorHandler: fn => {
return (req, res, next) => {
Promise.resolve(fn).catch(next)
}
}