NodeJS Express中间件不使用next()就转到下一个

时间:2018-12-16 21:56:18

标签: node.js express

我正在尝试为NodeJS学习Express,但是遇到了这个问题:

我试图在url上添加2个中间件,以便在/ user上执行某些操作,并在root上执行一些其他操作。但是,即使我不使用next(),也总是调用根中间件,并且如果我访问“ /” URL,根中间件也会被调用两次。

const express = require('express');

const app = express();


app.use('/user', (req, res, next) => {
    console.log('In user middleware ');
    res.send('<h1>Hello from User page</h1>');
});

app.use('/', (req, res, next) => {
    console.log('In slash middleware !');
    res.send('<h1>Hello from Express !</h1>');
});

app.disable('etag');
app.listen(3000);

4 个答案:

答案 0 :(得分:3)

它应该是getpost而不是use

-getpost是路线

-use是中间件功能

check this

 const express = require('express');

  const app = express();


  app.get('/user', (req, res, next) => {
      console.log('In user middleware ');
      res.send('<h1>Hello from User page</h1>');
  });

  app.get('/', (req, res, next) => {
      console.log('In slash middleware !');
      res.send('<h1>Hello from Express !</h1>');
  });

  app.disable('etag');
  app.listen(3000);

答案 1 :(得分:1)

来自GitHub.com上的问题

https://github.com/expressjs/express/issues/3260

  

您好,@ davidgatti,我的“根路径中间件”,我想您正在谈论   nr_one。如果是这样,是的,它当然会在每个请求上执行;应用使用   是一个前缀匹配系统。每个URL都以/开头,因此任何装入   /将当然会被执行:)

答案 2 :(得分:0)

好的,我无法确认这一点,但是我怀疑您正在跟踪的教程中可能缺少一行。

正如您所说,app.use是一种中间件,它将被添加到所有路由

因此,当您加载时,在期望中间件的地方说一些 url ,然后它将不知道请求类型(发布,放置,删除或获取请求)。

任何替代方法都可以尝试类似

 app.use('/user', (req, res, next) => {
     if (req.method === 'GET') {
      console.log('In user middleware ');
      res.send('<h1>Hello from User page</h1>');
} 
  });

再次,只需检查并彻底比较他的代码

Justin's answer for reference

添加此链接

答案 3 :(得分:-1)

为了避免此类问题,您必须使用return关键字。

将文件发送到服务器时,请使用return

尝试以下代码,

const express = require('express');

const app = express();


app.use('/user', (req, res, next) => {
    console.log('In user middleware ');
    return res.send('<h1>Hello from User page</h1>');
});

app.use('/', (req, res, next) => {
    console.log('In slash middleware !');
    return res.send('<h1>Hello from Express !</h1>');
});

app.disable('etag');
app.listen(3000);

在第13和8行,我使用了return关键字。

因此,当您提出http://localhost:3000/请求时,您会收到

  

您好,Express!

每当您提出http://localhost:3000/user请求时,您都会收到

  

您好,来自用户页面