我几乎尝试过所有事情,现在我的思绪终于放弃了。因此,我在这里询问方向。这个简单的代码片段(我们称之为app.js
):
var express = require('express');
var app = express();
app.use(function(req, res) {
console.log('Request made')
res.send('Hello World!');
});
app.listen(3000, function() {
console.log('Example app listening on port 3000!');
});
像node app.js
一样运行会在我的终端中产生以下结果,考虑到我只点击localhost:3000
一次:
Example app listening on port 3000!
Request made
Request made
Request made
Request made
Request made
Request made
Request made
...continues...
出于某种原因,我最终会一次又一次地重复“请求制作”,尽管请求已完成并传送到浏览器。
如果我使用app.get('*', function(req, res) { ... })
代替app.use(function(req, res) { ... })
,情况也是如此。
如果我转向更具体的内容,例如app.get('/', function(req, res) { ... })
重复停止,我按预期得到一个“请求”。但是,我需要匹配所有传入的请求 - 在我的应用程序中,我做的事情比记录“Request made”更复杂:)
有什么想法吗?谢谢!
节点:8.11.2 快递:4.16.3
答案 0 :(得分:1)
你需要做一些事情,然后将结果传递给下一个回调,而不是发送一个响应,使其递归,因为它拦截了一个响应然后做同样的循环。
// this middleware will not allow the request to go beyond it
app.use(function(req, res, next) {
res.send('Hello World');
});
// requests will never reach this route
app.get('/', function (req, res) {
res.send('Welcome');
});
您需要调用next()
来调用中间件
app.get('/', function (req, res, next) {
try {
// do something and return result
res.send('Welcome');
} catch(e) {
next(e)
}
});
app.use(function (err, req, res, next) {
console.log('Error occurred')
res.status(err.statusCode).send(err.message);
});