尽管已发送结果,但Node + Express会反复触发/循环请求

时间:2018-05-24 20:41:52

标签: javascript node.js express

我几乎尝试过所有事情,现在我的思绪终于放弃了。因此,我在这里询问方向。这个简单的代码片段(我们称之为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

1 个答案:

答案 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);
});