2013-01-16 25 views
7

Ho una conoscenza molto limitata del nodo e dell'IO-blocco nobile, quindi perdonami se la mia domanda è troppo ingenua.node.js attendere la risposta

Al fine di restituire le informazioni necessarie nel corpo risposta, ho bisogno di

  • Effettuare una chiamata al API 3rd party
  • Attendere la risposta
  • Aggiungi alcune modifiche e tornare risposta JSON con le informazioni che ho ottenuto da API.

La mia domanda è .. come posso aspettare risposta? Oppure è possibile inviare le informazioni al client solo quando ho ricevuto risposta da API (per quanto ne so, la connessione dovrebbe essere bidirezionale in questo caso, il che significa che non potrò farlo utilizzando HTTP).

E ancora un'altra domanda. Se una richiesta attende la risposta dall'API, questo significa che anche gli altri utenti saranno costretti ad attendere (dal momento che il nodo è a thread singolo) finché non aumenterò il numero di thread/processi da 1 a N?

risposta

8

Si passa una richiamata alla funzione che chiama il servizio. Se il servizio è un database, ad esempio:

db.connect(host, callback); 

E da qualche altra parte nel codice:

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

oppure è possibile utilizzare funzioni anonime, quindi:

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

tra la chiamata e il callback, il nodo gestisce liberamente altri client/connessioni, "non bloccante".

6

Questo tipo di situazione è esattamente ciò che il nodo è stato progettato per risolvere. Una volta ricevuta la richiesta dal tuo cliente, puoi fare una richiesta http, che dovrebbe avere un parametro di callback. Questo richiama la funzione di callback quando la richiesta viene eseguita, ma il nodo può eseguire altre operazioni (inclusa la pubblicazione di altri client) mentre si attende la risposta. Una volta completata la richiesta, è possibile che il codice restituisca la risposta al client che è ancora in attesa.

La quantità di memoria e CPU utilizzata dal processo del nodo aumenta man mano che i client aggiuntivi si collegano ad esso, ma è necessario un solo processo per gestire molti client simultanei.

Il nodo si concentra sull'esecuzione lenta dell'I/O in modo asincrono, in modo che il codice dell'applicazione possa avviare un'attività e quindi far ricominciare l'esecuzione del codice dopo che l'I/O è stato completato.

4

Un tipico esempio potrebbe chiarire. Facciamo una chiamata all'API FB. Quando otteniamo una risposta, la modifichiamo e quindi inviamo JSON all'utente.

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