2013-01-16 18 views
7

Mam bardzo ograniczoną wiedzę na temat węzłów i blokujących IO, więc wybacz mi, jeśli moje pytanie jest zbyt naiwne.node.js czekaj na odpowiedź

W celu powrotu potrzebne informacje w organizmie odpowiedzi, muszę

  • Połącz się 3rd party API
  • Poczekaj na odpowiedź
  • Dodaj pewne modyfikacje i powrócić odpowiedź JSON z informacjami ja Dostałem z API.

Moje pytanie brzmi .. jak mogę poczekać na odpowiedź? Czy możliwe jest wysłanie informacji do klienta tylko wtedy, gdy otrzymałem odpowiedź z API (o ile wiem, połączenie powinno być dwukierunkowe w tym przypadku, co oznacza, że ​​nie będę mógł tego zrobić za pomocą HTTP).

I jeszcze jedno pytanie. Jeśli jedno żądanie oczekuje odpowiedzi z interfejsu API, czy oznacza to, że inni użytkownicy będą zmuszeni również czekać (ponieważ węzeł jest jednowątkowy), dopóki nie zwiększę liczby wątków/procesów od 1 do N?

Odpowiedz

8

Przekazujesz wywołanie zwrotne do funkcji, która wywołuje usługę. Jeśli usługa jest w bazie, na przykład:

db.connect(host, callback); 

A gdzie indziej w kodzie:

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

lub użyć anonimowych funkcji, więc:

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

Między rozmowy a wywołanie zwrotne, węzeł obsługuje dowolnie inne klienty/połączenia, "nie blokuje".

6

Ten rodzaj sytuacji jest dokładnie tym, do którego węzła zaprojektowano rozwiązanie. Po otrzymaniu żądania od klienta można utworzyć żądanie http, które powinno przyjąć parametr wywołania zwrotnego. Spowoduje to wywołanie funkcji zwrotnej, gdy żądanie zostanie wykonane, ale węzeł może wykonać inną pracę (w tym obsługę innych klientów) podczas oczekiwania na odpowiedź. Po zakończeniu żądania możesz kazać swojemu kodowi zwrócić odpowiedź klientowi, który wciąż czeka.

Ilość pamięci i procesora używanego przez proces węzłowy wzrośnie wraz z łączeniem się z nim dodatkowych klientów, ale do obsługi wielu równoczesnych klientów potrzebny jest tylko jeden proces.

Węzeł skupia się na asynchronicznym wykonywaniu powolnego wejścia/wyjścia, dzięki czemu kod aplikacji może uruchomić zadanie, a następnie ponownie uruchomić kod po zakończeniu operacji we/wy.

4

Typowy przykład może wyjaśnić. Dzwonimy do API FB. Kiedy otrzymamy odpowiedź, modyfikujemy ją, a następnie wysyłamy JSON do użytkownika.

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 
    }); 
}); 
Powiązane problemy