节点,每个请求和响应都是唯一的或缓存的,无论url如何

时间:2014-11-01 23:15:37

标签: node.js

在我正在使用的应用中,我遇到了#34;标头已经发送错误"如果我使用并发和并行请求方法进行测试。

最终我使用!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: 另一个问题是在使用mocha,super agent进行测试时,如果我只是通过postman发送另一个请求,那么正在进行的测试中,mocha中的一个测试以超时错误结束。我采取的这些步骤是为了确保代码能够为同步并行请求做好生产准备吗?请告知我可以采取哪些措施来确保节点/代码在压力下工作。

编辑3:

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

1 个答案:

答案 0 :(得分:1)

好的,试图通过我们在评论中的所有对话来捕捉为您解决的问题,我将尝试总结一下:

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

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

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

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

  5. 创建唯一ID的一种简单方法是使用单调增加的计数器。