node.js等待响应

关于节点和阻塞IO的知识我非常有限,所以如果我的问题太天真,请原谅我。

为了在回复正文中返回所需的信息,我需要

  • 拨打第三方API
  • 等待回应
  • 添加一些修改,并返回JSON响应与我从API获得的信息。

我的问题是..我怎么能等待回应? 或者只有当我收到来自API的响应时才能将信息发送给客户端(据我所知,在这种情况下连接应该是双向的,这意味着我将无法使用HTTP)。

还有一个问题。 如果一个请求等待API的响应,这是否意味着比其他用户将被迫等待(因为节点是单线程),直到我将线程/进程的数量从1增加到N?

您将callback传递给调用该服务的函数。 如果服务是数据库,例如:

db.connect(host, callback); 

在代码中的其他地方:

 var callback = function(err, dbObject) { // The connection was made, it's safe to handle the code here console.log(dbObject.status); res.json(jsonObject, 200) }; 

或者你可以使用匿名函数,所以:

 db.connect(host, function(err, dbObject) { // The connection was made, it's safe to handle the code here console.log(dbObject.status); res.json(jsonObject, 200) }); 

在呼叫和回叫之间,节点自由处理其他客户/连接,“非阻塞”。

这种情况正是节点devise要解决的问题。 一旦收到来自客户端的请求,就可以发起一个http请求,该请求应该带有一个callback参数。 当请求完成时,这将调用你的callback函数,但是当你等待响应的时候,节点可以做其他的工作(包括服务其他客户端)。 一旦请求完成,您可以让您的代码返回到仍在等待的客户端的响应。

节点进程使用的内存和CPU数量将随着附加客户端的连接而增加,但只需要一个进程来处理多个同时发生的客户端。

节点着重于asynchronous执行缓慢的I / O,以便应用程序代码可以启动任务,然后在I / O完成后再次启动代码。

一个典型的例子可能会说清楚。 我们打电话给FB API。 当我们得到一个响应,我们修改它,然后发送JSON给用户。

 var express = require('express'); var fb = require('facebook-js'); app.get('/user', function(req, res){ fb.apiCall('GET', '/me/', {access_token: access_token}, function(error, response, body){ // access FB API // when FB responds this part of the code will execute if (error){ throw new Error('Error getting user information'); } body.platform = 'Facebook' // modify the Facebook response, available as JSON in body res.json(body); // send the response to client }); });