Sto lavorando a un progetto che utilizza Node.js per un plug-in Haraka (un server smtp).Come posso effettuare una richiamata che richiede informazioni sulla funzione figlio
Questo è Node.JS e ho un piccolo problema con i callback. Non sono stato in grado di convertire questo particolare codice per utilizzare una richiamata.
Quindi, questo è il codice che ho:
exports.hook_data = function (next, connection) {
connection.transaction.add_body_filter('', function (content_type, encoding, body_buffer) {
var header = connection.transaction.header.get("header");
if (header == null || header == undefined || header == '') return body_buffer;
var url = 'https://server.com/api?header=' + header ;
var request = require('request');
request.get({ uri: url },
function (err, resp, body) {
var resultFromServer = JSON.parse(body);
return ChangeBuffer(content_type, encoding, body_buffer, resultFromServer);
}
);
});
return next();
}
Questo codice non funziona perché non aspetta il richiamo della richiesta di continuare. Devo completare la richiesta prima dello next()
;
E questi sono i requisiti:
- Alla fine del
exports.hook_data
è obbligatoria per tornarenext()
. Ma deve solo restituirlo dopo la richiesta. - Devo restituire un
Buffer
inadd_body_filter
ma ho bisogno di creare il buffer con le informazioni ottenute da un server. - Per ottenere la richiesta di ricezione, è necessario utilizzare un parametro (
header
) che ho solo all'interno diadd_body_filter
.
Quindi il problema è che non riesco a fare la richiesta prima add_body_filter
e mettere il risultato all'interno di una richiamata perché il parametro che ho bisogno di fare la richiesta sono solo all'interno add_body_filter
.
Qualche consiglio, per favore?
Non è possibile utilizzare un asincrona funzione in Javascript, ma richiede che si comporti in modo sincrono. Questo è semplicemente NON possibile. Se si dispone di un'operazione asincrona, è necessario eseguire il codice per utilizzarlo in modo asincrono. Ciò significa restituire risultati in una promessa o tramite un callback, NON tramite il valore di ritorno dalla funzione perché la funzione restituirà PRIMA che l'operazione asincrona sia completata. Probabilmente trarrai vantaggio dalla lettura di questo [Come restituire la risposta dall'operazione asincrona] (http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call/14220323 # 14.220.323). – jfriend00
Puoi passare un callback a 'ChangeBuffer'? –
E dove usi 'body_buffer' (vedi la linea # 4) e il risultato di' ChangeBuffer (content_type, encoding, body_buffer, resultFromServer) '(vedi la riga # 11) che restituisci? Immagino da nessuna parte, giusto? –