我对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
};
答案 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()。所有其他错误都是我的: - )