Я пытаюсь создать лямбда-функция на Netlify и использую для этого их Netlify Lambda CLI.
Теперь у меня возникла проблема при использовании async / await в Promises, потому что он регистрирует UnhandledPromiseRejectionWarning, хотя я использую try / catch.
Вот демонстрация:
import fetch from "node-fetch";
exports.handler = async function(event, context, callback) {
try {
const response = await fetch("https://api.chucknorris.io/jokes/random");
const data = await response.json();
callback(null, {
statusCode: 200,
body: data.value
});
} catch (err) {
console.error(err);
}
};
Бревно:
netlify-lambda: Starting server
Lambda server is listening on 9000
Hash: 533f41e1d4248894ae20
Version: webpack 4.26.1
Time: 966ms
Built at: 11/28/2018 10:59:44 PM
Asset Size Chunks Chunk Names
test.js 18.3 KiB 0 [emitted] test
Entrypoint test = test.js
[0] external "stream" 42 bytes {0} [built]
[1] external "zlib" 42 bytes {0} [built]
[2] external "url" 42 bytes {0} [built]
[3] external "http" 42 bytes {0} [built]
[4] external "https" 42 bytes {0} [built]
[5] ./test.js + 1 modules 40.8 KiB {0} [built]
| ./test.js 1.14 KiB [built]
| ../node_modules/node-fetch/lib/index.mjs 39.6 KiB [built]
Request from ::1: GET /test
Response with status 200 in 685 ms.
(node:99167) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'statusCode' of undefined
at callback (/Users/nunoarruda/Desktop/test/node_modules/netlify-lambda/lib/serve.js:22:42)
at /Users/nunoarruda/Desktop/test/node_modules/netlify-lambda/lib/serve.js:41:21
at process.internalTickCallback (internal/process/next_tick.js:77:7)
(node:99167) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:99167) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
Связанная проблема GitHub: https://github.com/netlify/netlify-lambda/issues/43
Почему netlify-lambda регистрирует UnhandledPromiseRejectionWarning при использовании async / await в обещаниях? Как я могу это исправить?
Netlify подтвердил, что не должно быть обратного вызова при вызове асинхронной функции и для функций netlify.





With the new Node.js 8.10 runtime, there are new handler types that can be declared with the “async” keyword or can return a promise directly.
В документации AWS v8.10 поддерживает async / await, а новая версия по умолчанию в Netlify теперь использует эту версию. В документации AWS, в примерах показаны эти два новых типа обработчиков, исключающих использование обратного вызова. Мы должны сделать то же самое в наших функциях, используя Netlify.
Мне удалось удалить сообщение об ошибке локально, используя приведенный ниже код, без использования обратного вызова:
import fetch from "node-fetch";
exports.handler = async function(event, context) {
try {
const response = await fetch("https://api.chucknorris.io/jokes/random");
if (!response.ok) { // NOT res.status >= 200 && res.status < 300
return { statusCode: response.status, body: response.statusText };
}
const data = await response.json();
return {
statusCode: 200,
body: data.value
// if you want to return whole json string
// headers: { 'Content-Type': 'application/json' },
// body: JSON.stringify(data)
};
} catch (err) {
console.info(err); // output to netlify function log
return {
statusCode: 500,
body: err.message // Could be a custom message or object i.e. JSON.stringify(err)
};
}
};
Можете ли вы уточнить свои аргументы в пользу удаления async, await? «поскольку node-fetch использует обещание». не имеет смысла
@ 8eecf0d2 Сначала я действительно ошибся в своих предположениях. Я также использовал очень старую версию интерфейса командной строки для своего теста. Начиная с этого редактирования.
Я пытался сказать (плохо), что без async / await вы можете заставить обработчик возвращать обещание напрямую. Но этот ответ заслужил решение для async/await, поскольку именно об этом он и спрашивает. Обратные вызовы следует удалить.
Я обновил проблема здесь, чтобы показать рабочий пример возврата обещания, а не обработчика функции async.
Я смог заставить его работать после некоторого тестирования и показал это в своем ответе, но жду подтверждение от Netlify, если они тоже этого ожидают.