Возврат html-ответа на вызывающую функцию в nodejs

У меня есть этот фрагмент Node.js.

var requestify = require('requestify');
// [...]
function remoterequest(url, data) {
  requestify.post(url, data).then(function(response) {
    var res = response.getBody();
    // TODO use res to send back to the client the number of expected outputs
  });
  return true;
}

Мне нужно вернуться res содержание вместо trueВернемся к звонящему.

Как я могу это сделать? В этом случае requestifyМетод является асинхронным, поэтому возвращаемое значение невозможно получить (так как оно еще не сгенерировано). Как я могу решить это? Как я могу отправить синхронный HTTP-запрос POST (даже без requestify)?

2 ответа

Вам нужно вернуть обещание и использовать его в методе then обещанного, возвращенного remoteRequest:

var requestify = require('requestify');
// [...]
function remoterequest(url, data) {
  return requestify
    .post(url, data)
    .then((response) => response.getBody());
}

//....

remoteRequest('/foo', {bar: 'baz'}).then(res => {
  //Do something with res...
});

Обратите внимание, что он все равно не будет синхронным POST, но вы сможете использовать response.getBody(), если он доступен, если это то, что вы хотели

Вы можете обратиться к этому обсуждению о том, как использовать контент, возвращаемый из обещания. Как я могу вернуть ответ от асинхронного вызова?

Как упомянуто @Logar, вы не можете напрямую использовать контент, возвращенный в вашем обещании. Сначала вы должны вызвать свой метод, возвращающий обещание, и использовать .then сделать возвращаемый контент доступным.

Пример:

    var requestify = require('requestify');
    // [...]
    // This function returns a promise, so you have to call it followed by `.then` to be able to use its returned content
    function remoterequest(url, data) {
        requestify
            .post(url, data)
            .then((response) => {
                return response.getBody();
            });
    }
    //....
    //... Some other code here
    //....

    // Make a call to your function returning the promise
    remoterequest('your-url-here', {data-to-pass-as-param})
        .then((res) => { // Calling `.then` here to access the returned content from `remoterequest` function
            // Now you can use `res` content here
        });

Другие вопросы по тегам