2013-01-16 127 views
7

我對節點和阻塞IO的知識非常有限,所以如果我的問題太天真,請原諒我。node.js等待回覆

爲了響應身體恢復所需的信息,我需要

  • 請對第三方API的調用
  • 等待迴應
  • 添加了一些修改,並返回與信息JSON響應我從API獲得。

我的問題是......我該如何等待迴應?或者只有當我收到來自API的響應時才能將信息發送給客戶端(據我所知,在這種情況下連接應該是雙向的,這意味着我將無法使用HTTP進行此操作)。

還有一個問題。如果一個請求等待API響應,這是否意味着比其他用戶將被迫等待(因爲節點是單線程),直到我將線程/進程的數量從1增加到N?

回答

8

您將回調傳遞給調用服務的函數。如果該服務是一個數據庫,例如:

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) 
}); 

的通話之間和回調,節點自由處理其他客戶端/連接,「非阻塞」。

6

這種情況正是節點設計要解決的問題。一旦收到來自客戶端的請求,就可以發出一個http請求,該請求應該帶有一個回調參數。這將在請求完成時調用你的回調函數,但是當你在等待響應時,節點可以完成其他工作(包括服務其他客戶端)。請求完成後,您可以讓代碼將響應返回給仍在等待的客戶端。

節點進程使用的內存和CPU數量將隨着附加客戶端連接到其中而增加,但只需一個進程即可處理多個同時發生的客戶端。

節點專注於異步執行緩慢的I/O,以便應用程序代碼可以啓動任務,然後在I/O完成後再次開始執行代碼。

4

一個典型的例子可能會說清楚。我們打電話給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 
    }); 
});