Node.js 节点服务器中的慢速http请求

Node.js 节点服务器中的慢速http请求,node.js,express,httprequest,response,node-async,Node.js,Express,Httprequest,Response,Node Async,在我的应用程序中,我必须创建一个用于搜索n个项目的API。 服务器的逻辑是在自己的数据库中查找项目,如果结果计数小于n,则使用第三方服务的搜索结果来填充剩余的结果 我在这里面临的问题是,执行第三方请求所需的时间。 从服务器执行第三方请求平均需要900-1500 ms,但是如果我从浏览器或任何其他rest客户端执行相同的请求,同样需要300-400 ms 这就是我正在做的 router.get('/search/:searchParam', function (req, res, next) {

在我的应用程序中,我必须创建一个用于搜索n个项目的API。 服务器的逻辑是在自己的数据库中查找项目,如果结果计数小于n,则使用第三方服务的搜索结果来填充剩余的结果

我在这里面临的问题是,执行第三方请求所需的时间。
从服务器执行第三方请求平均需要900-1500 ms,但是如果我从浏览器或任何其他rest客户端执行相同的请求,同样需要300-400 ms

这就是我正在做的

router.get('/search/:searchParam', function (req, res, next) {
    async.parallel({
        local : function(callback){
            //Search for object in DB
            callback(null,localResults);
        },
        fallback : function(callback) {
            var url = <searchURL>+<queryParam>;
            //This takes 900-1500 ms
            request(url, function (error, response, body) {
                if(error){
                    return callback(err);
                }
                callback(null,JSON.parse(body));
            });
        }
    }, function(err, results){
        if(err){
            return reject(err);
        }
        if(results.local.length < searchLimit) {
            results.local.push.apply(results.local,_.first(results.fallback,searchLimit-results.local.length));
            results.local = results.local.reduce(function(a,b){if(a.indexOf(b)<0)a.push(b);return a;},[]);
        }
        res.json(results.local);
    })
})
router.get('/search/:searchParam',函数(req,res,next){
异步并行({
本地:函数(回调){
//在数据库中搜索对象
回调(null,localResults);
},
回退:函数(回调){
var url=+;
//这需要900-1500毫秒
请求(url、函数(错误、响应、正文){
如果(错误){
返回回调(err);
}
回调(null,JSON.parse(body));
});
}
},函数(错误,结果){
如果(错误){
退货拒绝(err);
}
if(results.local.lengthresults.local=results.local.reduce(函数(a,b){if(a.indexOf(b)这可能是因为您没有在请求中使用keepalive。我认为这可能会修复它,但我可能错了


request({url:url,forever:true},function(error,response,body){
请尝试在本地数据库搜索的请求回调中调用第三方API,而不是使用
async
库。

根据您使用的数据库,您有(和使用)吗正在搜索的列/字段的索引?@AshleyB我的数据库响应时间很好,b/w为40-100毫秒。这是对第三方服务器的http请求,正如前面所述。如果您的高响应时间来自第三方,您将无法做太多。它在那边,而不是您的。取决于服务器的最新状态回答是,您可以使用Redis之类的工具在本地缓存它,并带有过期日期。@AshleyB如果您阅读了这个问题,您会发现我已经清楚地提到,当从浏览器发出相同的第三方呼叫时,需要300-400毫秒来响应。当从节点服务器执行相同的第三方呼叫时,需要900-1500毫秒在标题中添加Keep Alive,但不起作用。添加forever:true,其行为符合预期。干杯