Возврат 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
});