为什么当我尝试将中间件函数导出到 module.exports 对象时'Next is not a function'?



我在我的logger.js模块中写了一个中间件功能,然后将其导入到app.js中并使用

// ------ File : logger.js ------ //
function log(req, res, next) {
  console.log('Logging details ... ');
  next();
}
module.exports = log;
// ------ File : app.js -------- //
const logger = require('./logger');
app.use(logger);

上面的代码无需任何问题而起作用,我的对数功能有效。但是,如果我以以下方式导出此日志函数(将其添加到module.exports对象),则会获得错误

// ------ File : logger.js -------//
function log(req, res, next) {
  console.log('Logging details ... ');
  next();
}
module.exports.log = log;
// ------ File : app.js -------- //
const logger = require('./logger');
app.use(logger.log());

Logging details ...
D:express-demo-workedlogger.js:4
    next();
    ^
TypeError: next is not a function
    at Object.log (D:express-demo-workedlogger.js:4:5)
    at Object.<anonymous> (D:express-demo-workedapp.js:18:16)
    at Module._compile (internal/modules/cjs/loader.js:738:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:749:10)
    at Module.load (internal/modules/cjs/loader.js:630:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:570:12)
    at Function.Module._load (internal/modules/cjs/loader.js:562:3)
    at Function.Module.runMain (internal/modules/cjs/loader.js:801:12)
    at internal/main/run_main_module.js:21:11
[nodemon] app crashed - waiting for file changes before starting...

有人可以向我解释为什么这行为不同,以及如何纠正我在这里添加的第二个代码段?

app.use(logger.log());

这将立即致电Logger.log,没有任何参数。logger.log返回的任何内容都将传递到app.use中。由于您没有通过任何参数,因此未定义是不确定的,导致了这个例外。

相反,做:

app.use(logger.log);

这将将logger.log传递到app.use。在某个时候,将调用logger.log,传递正确的参数。

在这里:

app.use(logger.log());

呼叫 log,没有任何参数,并将其返回值传递到app.use中。由于log期望并使用其参数,因此在next()上会失败,因为next参数的值为undefined,因为您没有通过它来传递参数。

您可能只是在以下方式传递该功能:

app.use(logger.log);
// No () ---------^

相关内容

最新更新