Route.post()需要回调函数,但是得到了[object Undefined]:向我解释

时间:2019-11-29 02:42:45

标签: javascript node.js express

谁能解释为什么当我从第一个箭头函数中删除括号时代码会启动,但是当我再次添加括号时,出现此错误'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;

2 个答案:

答案 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)
  }
}