调用外部Web服务时,本地托管的NodeJS会停止

时间:2015-03-15 06:37:35

标签: node.js web-services express

我有一个调用外部Web服务(http://www.fantasyfootballnerd.com/service/nfl-teams/json/test/)的路由,但每当我调用该路由时,它会挂起90秒或更长时间。这是我点击的路线:http://localhost:3000/external/teams

我通过npm(request)使用npm install request模块。我的问题似乎与这个问题类似:Node.JS Unable to call a service running on localhost on different port

我已尝试使用Chrome扩展程序Postman并直接将路径输入我的浏览器,但两者都挂了一段时间然后关闭请求而没有返回数据。有一点需要注意的是浏览器永远不会冻结,它似乎只是处理了一段时间。并且永远不会返回错误。

这是我的路线:

var express = require('express');
var router = express.Router();
var mongoose = require('mongoose');
var request = require('request');

/* GET /players listing. */
router.get('/teams', function(req, res, next) {
    var result;

    request.get("http://www.fantasyfootballnerd.com/service/nfl-teams/json/njrrdrk5f999/", function(err, res, body){
        if(!err){
            result = body;
        } else {
            console.log(err);
        }
    });

    res.send(result);
});

module.exports = router;

知道为什么这从未解决?

1 个答案:

答案 0 :(得分:1)

此代码错误,因为它在异步请求返回之前执行res.send()

/* GET /players listing. */
router.get('/teams', function(req, res, next) {
    var result;

    request.get("http://www.fantasyfootballnerd.com/service/nfl-teams/json/njrrdrk5f999/", function(err, res, body){
        if(!err){
            result = body;
        } else {
            console.log(err);
        }
    });

    res.send(result);
});

您必须将res.send(result)置于回调中,并且必须将request.get()调用的第二个参数命名为{{1}中与res参数不同的名称调用,这样你就可以到达第一个router.get()参数来使用它。

res

我不确定这会解释30秒的延迟,但这肯定是原始代码无效且无法工作的一个原因。