Это мой код в Javascript:
var params = {
FunctionName: "theTable",
InvokeArgs: JSON.stringify({ "name": "KirklandWA" })
};
lambda.invokeAsync(params, function (err, data) {
if (err) console.info(err, err.stack); // an error occurred
else {
console.info(data);
}
});
Это в лямбде:
exports.handler = async (event, context) => {
return "theReturnedValue";
};
Что происходит, так это то, что он не возвращает theReturnedValue
, а вместо этого возвращает
{Status: 202} Status: 202
Вызывается код в Lambda
, я в этом убедился на Cloudwatch
.
@NicoLA проблема в invokeAsync()
.
Убедитесь, что ваша лямбда выбрана в качестве среды выполнения NodeJs 8.10, после проверки вы должны вернуть обещание напрямую:
exports.handler = async (event, context) => {
return await new Promise((resolve, reject) => {
resolve({ message: "hello world" });
});
};
Я искал определение метода invokeAsync в документация по aws-sdk, и код состояния в порядке:
Callback parameters:
- err (Error) — the error object returned from the request. Set to null if the request is successful.
- data (Object) — the de-serialized data returned from the request. Set to null if a request error occurs. The data object has the following properties:
- Status — (Integer) It will be 202 upon success.
Я готовлю вам базовый пример, просмотрите файл handler.js:
https://github.com/ns4lin4s/stackoverflow
Не забывайте, что вы должны указать тело ответа:
Так что, когда вы закончите, дайте мне знать, как это работает!
Нет, результат тот же. Я получаю 202
, но не хочу возвращать никаких других данных.
откуда вызывается эта лямбда? Я предполагаю, что у вас есть api, и этот api вызывает другую лямбду, в любом случае вы должны указать данные ответа, выше есть изображение. пожалуйста, если не работает, дайте мне более подробную информацию .. я надеюсь помочь вам
Проблема в том, что ваш lambda function
ничего не возвращает вызывающему абоненту.
У вашей функции дескриптора есть третий параметр, который является функцией обратного вызова, которая используется для возврата результатов вызывающей стороне.
Функция callback
принимает два значения: ошибку и результаты.
callback(Error error, Object result);
Если вы предоставите значения Error, лямбда выдаст сообщение об ошибке, которое вы предоставите пользователю, если вы не предоставите значение Error, а результаты, это результаты, которые будут возвращены.
Все это очень хорошо задокументировано здесь
Вот основные примеры
callback(); // Indicates success but no information returned to the caller.
callback(null); // Indicates success but no information returned to the caller.
callback(null, "success"); // Indicates success with information returned to the caller.
callback(error); // Indicates error with error information returned to the caller.
Ваша функция-обработчик должна быть.
exports.handler = async (event, context,callback) => {
callback(null, "theReturnedValue");
};
Это неверный ответ. Проблема в том, что лямбда вызывается с помощью invokeAsync
, который является просто псевдонимом для вызова функции с типом вызова Event
, а не RequestResponse
. Это, как следует из названия, асинхронный вызов, выполняемый по принципу «запустил и забыл», то есть он не возвращает никакого ответа. Вместо этого используйте RequestResponse
, чтобы получить синхронный вызов, при котором результат переносится обратно. Другие ответы также касаются этого факта, но принятый ответ - нет.
Вы вызываете с помощью invokeAsync
, который возвращает только код состояния, как указано в документации. Вместо этого используйте invoke
с InvocationType: "RequestResponse"
Ссылка: https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/Lambda.html#invoke-property
var lambda = new AWS.Lambda({});
var params = {
FunctionName: "function_name",
InvocationType: "RequestResponse"
};
response = lambda.invoke(params, function(err, data) {
if (err) console.info(err, err.stack); // an error occurred
else console.info(data); // successful response
});
Мои два цента - invokeAsync устарел
Можете ли вы успешно запустить лямбда-тест в лямбда-консоли? В таком случае он должен сказать «Успех» и «theReturnedValue» в качестве ответа. если он успешно работает в тестовой консоли, ваша проблема, вероятно, связана с API-шлюзом.