我对 Node.js 相当陌生,我正在尝试制作一个简单的 Node.js REST 客户端来充当 API 和更大的应用程序之间的 SDK。
这是index.js
对应的客户端SDK部分中的当前代码:
var unirest = require('unirest');
var config = require('config');
var host = config.get('api.host');
unirest.get(host + '/api/products?_format=json')
.headers({'Accept': 'application/json', 'Content-Type': 'application/json'})
.end(function (response) {
console.log(response.body);
module.exports.getProducts = function() {
return response.body;
}
});
如果我在终端中执行:node index.js
,console.log
命令将返回 API 调用的预期结果
但是,如果我在主项目中安装该包(作为本地依赖项),它似乎不起作用。
以下是主项目中 index.js
的代码:
var SDK = require('api-sdk-js');
var result = SDK.getProducts;
console.log(result);
在这种情况下,当我执行node index.js
时,console.log
命令返回undefined
作为结果
变量,我怀疑这是由于 SDK 中的 GET 调用是异步的,因此它在响应之前返回值。
我不知道如何解决这个问题,有什么建议吗?
或者,它也对我来说是一个很好的例子,将 Node.js 中的 REST API 客户端作为 SDK(即作为能够从另一个项目安装的包)。
最佳答案
您的 unirest 调用实际上应该位于您的 module.exports.getProducts
方法内。
由于调用是异步的,您不能只是从中返回
。您需要某种回调。
module.exports.getProducts = function(callback) {
unirest.get(host + '/api/products?_format=json')
.headers({'Accept': 'application/json', 'Content-Type': 'application/json'})
.end(function (response) {
callback(response.body);
});
};
然后你可以像这样使用它:
var SDK = require('./api-sdk-js');
SDK.getProducts(function(products) {
console.log(products); // Should contain data from the callback
});
阅读How do I return the response from an asynchronous call?了解异步 JavaScript 的其他替代方案。
关于javascript - Node.js 中的 REST 客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38852233/