2014-11-01 49 views
0

在我工作的应用程序中,如果使用并发和并行请求方法进行测试,我遇到“头已发送错误”。节点,是每个请求和响应唯一或缓存,而不考虑URL

最终我解决了问题,使用!response.headersSent但我的问题是为什么我被迫使用它?是节点缓存相似的请求并重复使用它们以用于下一次重复呼叫。

if(request.headers.accept == "application/json") { 
     if(!response.headersSent) {response.writeHead(200, {'Content-Type': 'application/json'})} 
     response.end(JSON.stringify({result:{authToken:data.authToken}})); 
    } 

编辑

var express = require('express'); 
var app = express(); 

var server = app.listen(process.env.PORT || 3000, function() { 
    console.log('Example app listening at http://%s:%s', server.address().address, server.address().port); 
}); 

编辑2: 的另一个问题是在使用摩卡,超级经纪人测试和而如果我只是通过邮递员发送另一个请求就在旁边,的一个进步测试摩卡结束测试结束超时错误。我正在采取这些步骤来确保代码的生产已准备好同时进行并行请求?请告诉我可以采取哪些措施来确保节点/代码在压力下工作。

编辑3:

app.use(function(request, response, next){ 
    request.id = Math.random(); 
    next(); 
}); 
+0

你用什么软件包为你的HTTP?正常节点'http'? – Rudie 2014-11-01 23:18:34

+0

在您的应用程序中重现此问题,如果您按cmd + r(保持按下以进行持续刷新),则会使节点崩溃,如果没有“!response.headersSent” - 意味着节点重新使用请求/响应对象 – user2727195 2014-11-01 23:28:50

+3

关于头文件已被发送的错误几乎总是因为你没有正确处理异步操作,因此你的代码结束了顺序运行。与缓存无关。 – jfriend00 2014-11-02 00:11:48

回答

1

OK,试图捕捉到什么,透过我们的评论所有的谈话解决了这个给你,我会尝试在这里总结一下:

  1. 消息“头已发送错误“几乎总是由不正确的异步处理引起的,这会导致代码以错误的顺序调用响应对象上的方法。最常见的情况是非异步代码,它结束请求,然后执行一段时间结束的异步操作,然后尝试使用请求(但也有其他方法可能会误用它)。

  2. 每个请求和响应对象是在每个单独的HTTP请求到达节点/快递服务器时唯一创建的。它们不被缓存或重用。

  3. 由于请求处理中的异步操作,在任何给定时间可能有多个请求/响应对象正在使用。处理这些代码的代码不得将这些对象存储在任何单个全局变量中,因为多个对象可能处于一次处理状态。由于节点是单线程的,因此代码将只在任何给定时刻在任何给定请求上运行,但只要代码遇到异步操作(因此在异步操作完成之前无需做),另一个请求就可以开始运行。因此,多个请求可以很容易地在同一时间“在飞行中”。

  4. 如果您有一个需要一次跟踪多个请求的系统,您可以创建一个请求ID并将其附加到每个新请求。一种方法是用中间件堆栈中早期的几行快速中间件,它为每个新请求添加一个唯一的id属性。

  5. 一个简单的方法创造一个唯一的ID是只使用单调递增的计数器。

相关问题