在这里完成node.js初学者。我在某个地方看到了这个“你好世界”的例子
// Load the http module to create an http server.
var http = require('http');
// Configure our HTTP server to respond with Hello World to all requests.
var server = http.createServer(function (request, response) {
response.writeHead(200, {"Content-Type": "text/plain"});
response.end("Hello World\n");
});
// Listen on port 8000, IP defaults to 127.0.0.1
server.listen(8000);
// Put a friendly message on the terminal
console.log("Server running at http://127.0.0.1:8000/");
非常简单的代码,服务器使用纯文本“Hello World”通过简单的HTTP响应响应HTTP请求
我也准备好了一个库来从javascript发出HTTP请求
http.get(options, function(resp){
resp.on('data', function(chunk){
//do something with chunk
});
}).on("error", function(e){
console.log("Got error: " + e.message);
});
在这里,您使用一些选项发出HTTP请求,然后在回调中对响应执行某些操作。
如果在HTTP请求到达node.js服务器时要发出这样的API请求,会发生什么?由于流必须是单线程的,如何更改响应node.js在HTTP API请求的回调中发送给客户端的状态?那时响应是否会被发送到事件循环?如何在此系统中模拟同步请求,以便您可以使用API请求的响应向客户端发送响应?
由于流必须是单线程的,如何更改响应node.js在HTTP API请求的回调中发送给客户端的状态?
因为响应不是与已收到的请求同步发送的。
那时响应是否会被发送到事件循环?
在调用res.send
或类似函数之前,不会发送响应,而this answer或类似函数不必在触发请求回调的作业队列中处于同一作业中 - 而且通常不会。
如何在此系统中模拟同步请求,以便您可以使用API请求的响应向客户端发送响应?
没有必要,这样做会导致吞吐量下降。
在任何给定的线程上(并且NodeJS只使用一个),JavaScript基于作业队列工作:单个JavaScript线程通过从队列中拾取作业,一直运行代码,然后拾取来工作。队列中的下一个作业(或空闲,直到添加一个)。当事件进入或类似时,如果您为该事件设置了处理程序,则会将对处理程序的调用添加到作业队列中。 (作业队列实际上至少有两层;如果您有兴趣,请参阅get
了解更多信息。)
如果您没有响应调用处理程序的作业的代码中的“我们收到HTTP请求”,那就绝对没问题了。那是完全正常的。工作和请求完全不相互关联。因此,如果你启动一个异步过程(如readFile
或res.send
),这很好(也很正常)。稍后,当该进程的结果可用时,新作业将添加到队列中,JavaScript线程将其拾取,并使用http.get(options, function(resp){
resp.on('data', function(chunk){
resp.send(chunk);
});
}).on("error", function(e){
console.log("Got error: " + e.message);
});
或类似方法来回复正在等待的请求。
这就是NodeJS管理高吞吐量的方法,尽管只有一个线程:如果你使用异步I / O,那么你的实际代码不必长时间占用线程,因为它不等待I / O去完成。当I / O挂起时,它可以在其他事情上做更多的工作,然后在I / O完成时响应它。
您需要像这样更改代码:
qazxswpoi