REST-клиент в node.js

Я новичок в node.js и пытаюсь сделать простой REST-клиент node.js, который будет действовать как SDK между API и более крупным приложением.

Это текущий код в клиентской части SDK, соответствующей index.js:

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 для переменной result, я подозреваю, что это связано с тем, что вызов GET в SDK является асинхронным, поэтому он возвращает значение до получения ответа.

Я не уверен, как это исправить, какие-либо предложения?

В качестве альтернативы мне также подойдет хороший пример клиента REST API в node.js в качестве SDK (т. Е. В качестве пакета, который можно установить из другого проекта).


person rfc1484    schedule 09.08.2016    source источник


Ответы (1)


Ваш вызов unirest действительно должен быть внутри вашего метода module.exports.getProducts.

Из-за того, что вызов асинхронный, вы не можете просто return от него. Вам нужен какой-то обратный вызов.

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
});

Прочтите Как вернуть ответ на асинхронный вызов? для других альтернатив асинхронному JavaScript.

person Ben Fortune    schedule 09.08.2016