尽管提供了下一个陈述,中间件仍无法正常工作

问题描述 投票:0回答:1

我正在尝试创建2个中间件。但是节点并没有超出第一个中间件的范围。我也都给了next()。请指出我的错误。这是代码

app.js:

const express = require('express');
const logger = require('./log-winston');
const path = require("path");
const app = express();
const middle = require ('./api/middle/middlewares');
const registerRoutes = require('./api/routes/register')
const morgan = require('morgan');

app.use(morgan(middle.logFunction));
app.use(morgan(middle.logFunction, { stream: middle.accessLogStream }));


//////////////////////////////////////////////////////////////////////////
// These 2 are custom Middlewares, Code is not moving beyond the first one

app.use(middle.winstonLogger());
app.use(middle.showMachineId());

console.log("DEBUG");
app.use('/register', registerRoutes);


module.exports = app;

middlewares.js:

exports.winstonLogger = function (req, res, next) {
    console.log("This is winston Logger")
    next()
};

exports.showMachineId = function (req, res, next) {
    console.log("This is Machine ID")
    next()
};

结果是:

[nodemon] starting `node .\server.js`
This is winston Logger
[nodemon] clean exit - waiting for changes before restart

它不在app.js中打印第二个中间件“ showMachineId”和“ DEBUG”。

请帮助。

node.js express
1个回答
1
投票

更改此:

app.use(middle.winstonLogger());

对此:

app.use(middle.winstonLogger);

[第一个立即调用该函数,并将其不存在的返回值传递给app.use()。将()放在立即调用它的函数的末尾时。那不是你想要的。该代码不会超出此范围,因为调用它会立即不带任何参数地调用它,然后您尝试调用next(),因为throw将是next,所以它将调用undefined

[第二个将函数引用传递给app.use(),因此稍后可以调用中间件函数(这是您想要的)。要传递对函数的引用,请传递其末尾不带括号。

您的代码中还有其他相同问题的示例,也需要解决。

© www.soinside.com 2019 - 2024. All rights reserved.