如何处理节点http请求

时间:2015-05-20 23:26:04

标签: node.js express mean-stack node-async node-request

我正在尝试了解如何等待http请求在节点中完成。我想发出两个http请求,并在 http请求完成后,在一个名为的函数中使用结果。

我正在使用异步请求,并且一直在使用async.series,如下所示:

var request = require("request");
var express = require('express');
var async = require("async");

app.get('/rx', function(req, res) {
    var drug1 = req.query.drug1;
    var drug2 = req.query.drug2;
    console.log("in rx")
    console.log(drug1);
    console.log(drug2);
    var id1 = '';
    var id2 = '';

    /*part of code I'm concerned with*/
    async.series([
            function(callback) {
                id1 = getID(drug1);
                console.log("function one");
                console.log(id1);
                callback();
            },
            function(callback) {
                id2 = getID(drug2);
                console.log("function two");
                console.log(id2);
                callback();
            }
        ],
        function(err, results) {
            console.log(id1);
            console.log(id2);
            request("http://rxnav.nlm.nih.gov/REST/interaction/interaction.json?list?rxcuis=" + id1 + "&sources=" + id2, function(error, response, body) {
                console.log("finished!");
                res.json(body);
            });
        });
});

//returns an int ID
function getID(drugName) {
    request("http://rxnav.nlm.nih.gov/REST/Prescribe/rxcui.json?name=" + drugName, function(error, response, body) {
        var content = JSON.parse(body);
        var id = parseInt(content.idGroup.rxnormId);
        console.log("in getID function");
        console.log(id);
        return id;
    });
}

控制台输出显示:

in rx
advil
ibuprofen
seriesone
undefined
two
undefined
undefined
undefined
finished!

GET /rx?drug1=advil&drug2=ibuprofen 304 345ms
in getID function
153010
in getID function
5640

我想等到每个http请求函数完成,然后继续下一部分代码。我如何实现这一目标?

1 个答案:

答案 0 :(得分:1)

这个问题(或其变体)在StackOverflow上被问过1000多次。因此,我不打算解释它,但你可以搜索"返回async"如果您想了解更多信息,请访问此网站(右上角的搜索输入)。

基本问题是从异步函数返回值是不可能的(不知道为什么它们会接受回调?)。

针对您的具体情况,您需要将getId()更改为:

//returns an int ID
function getID(drugName, callback) {
    request("http://rxnav.nlm.nih.gov/REST/Prescribe/rxcui.json?name=" + drugName, function(error, response, body) {
        var content = JSON.parse(body);
        var id = parseInt(content.idGroup.rxnormId);
        console.log("in getID function");
        console.log(id);
        callback(null,id); // <--- this is how you return async values
    });
}

注意:null是因为async.js系列中的函数要求回调的第一个参数是错误的。因此,如果没有错误通过null。顺便说一下,这是一个标准的node.js实践。

然后在async.series()内进行:

async.series([
    function(callback) {
        getID(drug1,callback);
    },
    function(callback) {
        getID(drug2,callback);
    }
],
function(err, results) {
    console.log(results[0]); // id1
    console.log(results[1]); // id2

    // do the rest..
});