2014-10-08 91 views
0

我有一些真正奇怪的nodejs和express问题。Node.js express,timeout“发送后不能设置标题。”

我处理请求的函数之一,必须从DB获取某些内容并将其作为JSON发送给客户端。

所以是这样的:

  1. Get请求
  2. 呼叫DB
  3. 处理数据,并将其打包成JSON
  4. response.json(JSON)

通常它会一切正常,但如果在2和3之间有超时,因为它是异步的,它会自动创建响应,并且会出现错误“无法设置h发送之后的读者。“当我打电话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在里面有异步调用。

+0

我的猜测是,在发送响应之前,您并未等待异步请求先完成,因此您正在尝试向相同的请求发送两次响应。发布相关代码,我们可以肯定知道。 – mscdex 2014-10-08 18:09:11

+0

我添加了代码。但正如我已经描述的那样,代码中没有问题。问题在于超时,因为超时发生在异步调用的中间,然后表达集头并发送它。当通话结束时,我的功能再次尝试。我也可以单独重复这个错误。 – 2014-10-08 19:41:53

+1

我不会立即在这里看到任何错误。 'handleError'做了什么?另外,你为什么要设置“Content-Type”标题? 'res.json'已经为你做了这个 - > [链接](https://github.com/strongloop/express/blob/12f92a50dc59887c30f4c6f23fdfbfc616dcbef5/lib/response.js#L232) – Jordonias 2014-10-08 21:11:44

回答

0

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

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

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

默认情况下误差会做res.send(400),当正常获取到代码,你想执行有问题。