Как использовать мою функцию в Node.js / AWS Lambda - PullRequest
0 голосов
/ 25 октября 2018

Я создаю функцию AWS Lambda на основе Node.js.Внутри этой функции (функция A), между прочим, мне нужно вызвать другую лямбда-функцию (функция B).

Я провел тест по созданию тестовой лямбда-функции (функция C), которая просто обрабатывает вызовфункция B:

var aws = require('aws-sdk');
var lambda = new aws.Lambda;
exports.handler = function(event, context, callback) {
lambda.invoke({
  FunctionName: 'dynamoCatego',
  Payload: '{ "catid": "40000000"}'
}, function(err, data){
  if(err){console.log(err, err.stack);} // an error occurred
  else {callback(null, JSON.parse(data.Payload));} // successful response
}
)};

Отлично работает, я получил желаемый результат от функции.

Теперь я хочу встроить этот фрагмент кода в функцию A, и обычноиметь переменную (typeA), которая будет равна результатам вызова (для предоставленной полезной нагрузки).И я застрял здесь ...

Я пытался примерно скопировать / вставить кусок кода в основную функцию.Результат не извлекается, тогда созданная переменная вообще не имеет значения.

Я думаю, что мне нужно сделать, это определить подфункцию в корне лямбда-функции и, когда она мне понадобится, вызовите его с определенной полезной нагрузкой.

Если кто-нибудь может направить меня в правильном направлении, я буду очень благодарен

1 Ответ

0 голосов
/ 25 октября 2018

Вот пример обертывания удаленной лямбда-функции в другом лямбда-обработчике:

const aws = require('aws-sdk');
const lambda = new aws.Lambda();

// this is a specific lambda function wrapper,
// you could make it more general if needed.
// (i.e. make FunctionName the first argument.
async function dynamoCatego(args) {
  const FunctionName = 'dynamoCatego';
  const Payload = JSON.parse(args);
  // use .promise() to return a promise that can be awaited,
  // rather than deal with nested callbacks:
  const data = await lambda.invoke({ FunctionName, Payload }).promise();
  // n.b. this will just throw if there's an error,
  // so you may choose to try, catch it.
  return JSON.parse(data.Payload || 'null');
  // (Payload will be undefined if nothing is returned, but JSON.parse(undefined) is an error
}

exports.handler = async function handler(event, context, callback) {
  // other things...
  const result = await dynamoCatego({ catid: '40000000' });
  // other things...
  callback(null, result);
}

Обратите внимание, что использование async / await означает, что вам нужно будет использовать Node 8.10 (AWS дает вам возможность6.10, но нет особой причины использовать старую версию, кроме устаревших проектов).Вместо этого вы можете сделать это с помощью вложенных обратных вызовов, но я бы сказал, что этот подход гораздо более читабелен.

Если вы действительно хотите использовать обратные вызовы, вы можете сделать это следующим образомэто:

const Aws = require('aws-sdk');
const lambda = new Aws.Lambda();

function dynamoCatego(args, cb) {
  const FunctionName = 'dynamoCatego';
  const Payload = JSON.parse(args);
  lambda.invoke({ FunctionName, Payload }, (err, data) => {
    if (err) { throw err; }
    const result = JSON.parse(data.Payload);
    cb(result);
  });
}

exports.handler = function handler(event, context, callback) {
  // other things...
  dynamoCatego({ catid: '40000000' }, (result) => {
    // do things with the result...
    callback(null, result);
  });
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...