IBM Cloud Function не производит вывод
У меня возникли некоторые проблемы при запуске этой IBM Cloud Function:
/**
*
* main() will be run when you invoke this action
*
* @param Cloud Functions actions accept a single parameter, which must be a JSON object.
*
* @return The output of this action, which must be a JSON object.
*
*/
function main(params) {
const https = require('https');
https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
console.log(JSON.parse(data).explanation);
});
}).on("error", (err) => {
console.log("Error: " + err.message);
});
}
Моя проблема в том, что первые вызовы этой функции (по крайней мере, первые 3-4) не производят ничего. Последующие вызовы выполняются правильно, и журнал отображается правильно. Как я могу исправить это непредсказуемое поведение? Я хотел бы, конечно, получить мои данные при первом вызове этой функции. Благодарю.
1 ответ
Решение
Node.js использует неблокирующую модель асинхронного программирования. это main
функция возвращается до того, как ответ HTTP станет доступен.
Возврат Обещания позволит вам подождать ответа HTTP.
function main(params) {
return new Promise((resolve, reject) => {
const https = require('https');
https.get('https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY', (resp) => {
let data = '';
// A chunk of data has been recieved.
resp.on('data', (chunk) => {
data += chunk;
});
// The whole response has been received. Print out the result.
resp.on('end', () => {
const explanation = JSON.parse(data).explanation
console.log(explanation);
resolve({ explanation })
});
}).on("error", (err) => {
console.log("Error: " + err.message);
reject({ error: err.message })
});
})
}
Еще две вещи, которые нужно проверить:
- Не забудьте добавить
.json
к вашей конечной точке
- Пример:
https://<ibm-domain>/api/v1/web/<username>/default/<function>.json
- Обязательно выберите
Enable as Web Action
вEndpoints
Боковое меню.
Кроме того, вы сможете вернуть async
основная функция вместо Promise
объект.
async function main(params) {
try {
// some `await` function
} catch (e) {
// catch `await` errors
}
}
module.exports = main;