#node.js #async-await #aws-lambda #es6-promise #aws-codecommit
#node.js #async-await #aws-lambda #es6-обещание #aws-codecommit
Вопрос:
Я пытаюсь написать лямбда-функцию, которая принимает файл изображения через веб-форму и записывает его как новую фиксацию в репозиторий с использованием фиксации кода. По какой-то причине моя лямбда-функция, похоже, завершается перед вызовом createCommit , хотя я использую await аналогично моим предыдущим вызовам в функции.
Я попытался переписать функцию, которая обертывает createCommit, чтобы просто использовать promises, но, похоже, это тоже не работает. Мне интересно, есть ли какая-то особенность lambda, о которой я не знаю, или я неправильно использую async / await (я только недавно узнал, как их использовать)
это мой основной обработчик событий lambda:
exports.handler = async (event) => {
const [file, lastCommitId] = await Promise.all([getFile(event), getLastCommitId()]);
return await createCommit(file, lastCommitId)
.then(result => returnResponse(result, 200))
.catch(err => returnResponse(err, 500));
};
это моя функция-оболочка для createCommit
async function createCommit(file, parentCommitId) {
const fileContent = await file.content.toString('base64');
const params = {
"authorName": "admin",
branchName,
"commitMessage": "add image",
"email": "n/a",
"parentCommitId": parentCommitId,
"putFiles": [
{
fileContent,
"fileMode": "NORMAL",
"filePath": `src/images/${file.filename}`
}
],
repositoryName
};
console.log("creating commit against last commit id " parentCommitId);
const result = await codecommit.createCommit(params).promise();
console.log(JSON.stringify(result));
return resu<
}
Я ожидаю, что лямбда-функция будет ждать завершения вызова createCommit, но она просто распечатывает консоль.журнал, начинающийся с «создание фиксации по последней фиксации …» и завершается.
Ответ №1:
Вы не должны использовать await
и .then
вместе. измените свой код на и trycatch
, если вы хотите перехватить исключение или неудачный случай.
exports.handler = async (event) => {
const [file, lastCommitId] = await Promise.all([getFile(event), getLastCommitId()]);
return await createCommit(file, lastCommitId);
};
Смотрите приведенный ниже пример, чтобы лучше понять результат.
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds().then(x=>console.log('inside then ', x));
console.log('after await ',result);
}
asyncCall();
и без out then
function resolveAfter2Seconds() {
return new Promise(resolve => {
setTimeout(() => {
resolve('resolved');
}, 2000);
});
}
async function asyncCall() {
console.log('calling');
var result = await resolveAfter2Seconds();
console.log('after await ',result);
}
asyncCall();
Комментарии:
1. Пожалуйста, примите это как ответ, если это решит вашу проблему
2. Я удалил . тогда, как вы сказали, но функция все равно завершается, прежде чем дождаться завершения вызова
javascript exports.handler = async (event) => { const [file, lastCommitId] = await Promise.all([getFile(event), getLastCommitId()]); return await createCommit(file, lastCommitId); };
3. смотрите
const result = await codecommit.createCommit(params).promise();
этот фрагмент кода. эта надежда верна. Я не знаю, чтоcreateCommit
возвращается. Просто убедитесь, что вы не добавляете ничего лишнего, похожего на.then
. Убедитесь, что вашаcreateCommit
функция работает.4. Я думаю, что это довольно стандартная часть AWS SDK, например, это функция getLastCommitId, которую я написал, которая работает и ожидает возврата моей функции: ` функция async getLastCommitId() { const params = {branchName, repositoryName}; const result = await codecommit.getBranch(params).promise(); возвращает result.branch.commitId; } `
5. Не могли бы вы поделиться ссылкой поддержки, если она у вас есть. Кроме того, вы пробовали удалять
.promis()
и тестировали? иногда в документе могут быть некоторые ошибки.
Ответ №2:
Итак, оказывается, я правильно использовал async / await, у меня просто был 3-секундный тайм-аут для лямбда-функции, поэтому она завершалась до того, как смогла получить ответ от вызова createCommit .