【问题标题】:Node.js express, timeout "Can\'t set headers after they are sent."Node.js express,超时“发送后无法设置标头。”
【发布时间】:2014-10-09 08:13:08
【问题描述】:

我在使用 nodejs 和 express 时遇到了一些非常奇怪的问题。

我的一个处理请求的函数必须从数据库中获取一些东西并将其作为 JSON 发送给客户端。

原来是这样的:

  1. 获取请求
  2. 调用数据库
  3. 处理数据并将其打包为 JSON
  4. response.json(JSON)

通常一切正常,但如果在 2 到 3 之间超时,因为它是异步的,它会自动创建响应,并且会出现错误“发送后无法设置标头”。当我打电话给 4 时

还有其他人有这个问题吗?有什么正常的方法来处理它还是我只需要检查 response._header 是否已经设置好?

exports.appstimebygroup = function (req, res) {
    var resp = {};
    var clientId = Webapi.extractClientId(req);

    AppTime.getByGroupId(clientId, req.body.groupId, function(error, appstime){
        if (error) {
            handleError(error);
            resp.returnCode = 0;
            resp.message = "Some error have happened, please contact support!";
            res.setHeader("Content-Type", "application/json");
            res.json(resp);
            return;
        }

        resp.returnCode = 1;
        resp.appstime = appstime;

        if(res._header){
            console.log("header allready set!");
            return;
        }

        res.setHeader("Content-Type", "application/json");
        res.json(resp);
    });
};

并且AppTime.getByGroupId里面有异步调用。

【问题讨论】:

  • 我的猜测是,在发送响应之前,您不会先等待异步请求完成,因此您尝试向同一请求发送两次响应。贴出相关代码,我们就可以确定了。
  • 我添加了代码。但正如我已经描述的那样,代码没有问题。问题在于超时,因为超时发生在异步调用的中间,然后快速设置标题并发送它。当调用完成时,我的函数尝试再次执行。我也可以单独重复这个错误。
  • 我没有立即发现这里有什么问题。 handleError 是做什么的?另外,为什么要设置 Content-Type 标头? res.json 已经为你做到了 -> LINK
  • 我不确定 Content-Type,所以我手动添加了它。 handleError 只是用红色字母写 error.stack 没什么特别的。正如我所描述的,问题只是在 nodejs 等待 DB 并自动发送标头时触发超时。

标签: node.js express timeout


【解决方案1】:

好的,问题是多部分表单数据处理超时。

当这种情况发生时,它会调用 next(err)。

  form.on('error', function(err){
    if (!options.defer) {
      err.status = 400;
      next(err);
    }
    done = true;
  });

默认情况下,出错时会执行 res.send(400),当正常获取您想要执行的代码时会出现问题。

【讨论】:

    猜你喜欢
    • 2018-05-05
    • 2016-12-19
    • 2012-08-01
    • 2012-07-25
    • 1970-01-01
    • 2011-10-17
    • 2018-03-13
    • 1970-01-01
    • 2017-08-11
    相关资源
    最近更新 更多