У меня есть страница в облачном сервисе, содержащая этот js:
const url = "https://..private..";
const myForm = $( elements ).serialize();
$.post( url, myForm, () =>
{
alert("success");
})
.done( ( data ) =>
{
alert( "success2: " + data );
})
.fail( (error) =>
{
console.info( JSON.stringify(error ));
alert("fail:" + error);
});
Код всегда попадает в путь сбоя. Но нет объекта ошибки, и никакие другие переменные или объекты для просмотра в отладчике Chrome, локальные и глобальные, все пусты.
ОБНОВИТЬ: я добавил журнал консоли для ошибки, и он показывает: {"readyState":0,"status":0,"statusText":"error"}
Это конечная часть моей лямбда-функции. Журналы показывают, что я прохожу успешный путь, и данные вставляются в БД. Я пробовал обратный вызов с кодом состояния и без него. Я так и не получил отдачу в браузере с тех пор, как перешел на ajax.
// insert into the DB
dynamodb.put( insertData, ( err, data ) =>
{
if ( err )
{
context.done('error putting item into dynamodb failed: ' + err );
console.info('error putting item into dynamodb failed: ' + err );
}
else
{
console.info(" db insert success ");
// this worked for a form submit, but not ajax post
//callback(null, { statusCode: 200, body: { "retVal": true } });
let success = true;
callback(null, { "body": JSON.stringify(success) } );
}
});
ОБНОВИТЬ Я также попытался добавить объект ошибки в свою лямбду из предложенных ссылок, но в браузере не было изменений в возвращаемом значении. Я поместил следующий код в путь успеха, и журналы Cloudwatch зафиксировали его как ошибку, как и сказано в документации. Однако это не повлияло на то, что получил браузер. ах!
var myErrorObj = {
errorType : "InternalServerError",
httpStatus : 500,
requestId : context.awsRequestId,
trace : {
"function": "abc()",
"line": 123,
"file": "abc.js"
}
}
callback(JSON.stringify(myErrorObj));
Это также может быть ключом к разгадке: URL-адрес после сбоя содержит данные публикации, как если бы это был GET.
https://hidden.cloudfront.net/index.html?workOrder=123&ESID=123&userId=...
Я не уверен, что понимаю. Журналы показывают "успешная вставка базы данных", поэтому ошибка не установлена. Я могу установить ошибку, отправив искаженные данные, поэтому я знаю, что каждый путь работает. Браузер получает: {"readyState": 0, "status": 0, "statusText": "error"}



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Итак, это оказалось связано с тем, как я отправлял форму.
Моя кнопка HTML была типа представить:
<button class = "btn btn-primary" type = "submit">Submit form</button>
Несмотря на то, что у меня не было определенного действия в <form>, оно по-прежнему приводило к перезагрузке страницы. Таким образом, моя страница не синхронизировалась с ответом сервера.
Исправление в HTML, удалите тип и установите идентификатор для использования jQuery:
<button class = "btn btn-primary" id = "submitButton">Submit form</button>
В JS привяжите обработчик кликов к кнопке, как обычно:
$( "#submitButton" ).click( ()=>
{
...
});
Оглядываясь назад, я оглядываюсь на довольно фундаментальную ошибку. Надеюсь, это кому-то поможет.
(1), Не могли бы вы проверить, выдает ли вы ошибку из функции лямбда. Кажется, ваш обратный вызов не включает объект ошибки, как в docs.aws.amazon.com/lambda/latest/dg/…. (2), предполагая, что ваша функция Lambda доступна js в CloudFront через шлюз API, обратитесь к docs.aws.amazon.com/apigateway/latest/developerguide/…, чтобы убедиться, обрабатывает ли ваша конечная точка API ответ об ошибке, исходящий от Lambda, и возвращает ли клиенту правильный код состояния HTTP.