Node.js Http.Request回调 - 无法将数据传递给父函数

时间:2015-10-21 02:43:35

标签: javascript node.js api rest

我对Node和Javascript很新,而且我正在努力学习我的第一个Node模块。我尝试做的是导出特定API调用的函数,我想重用我的https.request函数,而不是复制每个函数中的代码。出于某种原因,我未能解决如何将数据传递回原始函数的问题。这是一个缩写版本 - listStuff函数将是处理各种api请求操作的众多函数之一。

'use strict';
const https = require('https');
const _ = require('underscore');
const hostStr = 'api.server.net';

function listStuff(){
  var pathStr = '/release/api/stuff';
  _apiCall(pathStr);
  //Would like to handle the https response data here
};

function _apiCall(pathStr){
  var options = {
    host: hostStr,
    path: pathStr
  };

  var req = https.get(options, function(res) {
    console.log("statusCode: ", res.statusCode);
    console.log("headers: ", res.headers);

    var responseString = '';

    res.on('data', function(d){
      responseString += d;
    });

    res.on('end', function(){
      var responseObject = JSON.parse(responseString);
    });
  });

  req.end();

  req.on('error', function(e){
    console.log(e);
  });
};

module.exports = {
  listStuff: listStuff
};

2 个答案:

答案 0 :(得分:1)

希望这会有所帮助。在apiCall函数中注册一个回调,然后检查回调参数以进行错误处理。然后,只需确保在想要结束函数调用时返回回调(在开头或错误处理中)。

       function listStuff(){
          var pathStr = '/release/api/stuff';
          _apiCall(pathStr, function(err, data) {
             if (err) // handle err
             //handle data.
           });
        };

        function _apiCall(pathStr, callback){
          var options = {
            host: hostStr,
            path: pathStr
          };

          var req = https.get(options, function(res) {
            console.log("statusCode: ", res.statusCode);
            console.log("headers: ", res.headers);

            var responseString = '';

            res.on('data', function(d){
              responseString += d;
            });

            res.on('end', function(){
              var responseObject = JSON.parse(responseString);
              return callback(null, responseObject);    
            });
          });

          req.end();

          req.on('error', function(e){
            console.log(e);
            return callback(e);
          });
        };

答案 1 :(得分:0)

使用Promise对象的方法略有不同。注意我把这看作是一个学习练习,希望它有所帮助。我没有为你编写所有代码,调试就是你的!

首先让_apiCall返回一个promise对象。

function listStuff()
{
    var pathStr = '/release/api/stuff';
    var promise = _apiCall(pathStr);
    promise.then( function( responceObject){

     // handle response object data

    });

    promise.catch( function( error){
        console.log( error.message);  // report error
    });
}

下一步是让_apiCall为它将在promise创建执行者内部启动的HTTPS请求返回一个promise对象。

function _apiCall(pathStr)
{   var options = {
        host: hostStr,
        path: pathStr
    };

    function beginGet( worked, failed)
    {
        // see below
    }

    return new Promise( beginGet);
}

最后写beginGet以启动并回调成功或失败函数,具体取决于get请求的结果。

function beginGet( worked, failed)
{   var req;
    var responseObj;

    function getCallBack( res)
    { // all your get request handling code
      // on error call failed( error)
      // on sucessful completion, call worked(responseObj)
    }
    req = https.get(options, getCallBack);
}

另外请查看https.get文档 - 我认为它会为您调用req.end()。所有其他错误都是我的: - )