我正在尝试为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);
答案 0 :(得分:3)
它应该是get
或post
而不是use
-get
或post
是路线
-use
是中间件功能
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>');
}
});
再次,只需检查并彻底比较他的代码
添加此链接答案 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
请求时,您都会收到
您好,来自用户页面