AWS Lambda: внешние вызовы асинхронных вызовов (раздел инициализации, вызов лямбды)

Конструктор класса A является тривиальным , если все верно:

  • Он неявно определен (синтезирован компилятор)
  • A не имеет виртуальных функций и виртуальных базовых классов
  • . Все прямые базовые классы A имеют тривиальные конструкторы
  • . Классы всех нестатических членов данных A имеют тривиальные конструкторы

1
задан Homer 18 March 2019 в 18:36
поделиться

2 ответа

client вызывается до того, как инициализируется; client var "экспортируется" (и вызывается) до завершения функции async. Когда вы звоните await client(), клиент все равно будет undefined.

отредактируйте, попробуйте что-то вроде этого

var client = async which => {
    var result =  await initSecrets("MyWebApi");
    var secret = JSON.parse(result.Payload);
    let api = new MyWebApiClient(secret.API_KEY, secret.API_SECRET); 
    return api(which) // assuming api class is returning a promise
}

async function initSecrets(secretName) {
    var input = {
    "secretName" : secretName
    };
    var result = await lambda.invoke({
       FunctionName: 'getSecrets',
       InvocationType: "RequestResponse",
       Payload: JSON.stringify(input)
    }).promise();
    return result;
}

exports.handler = async function (event, context) {

    var myReq = await client('Request');
    console.log(myReq);
};
0
ответ дан Tobin 18 March 2019 в 18:36
поделиться

Я столкнулся с подобной проблемой, пытаясь заставить next-js работать с aws-serverless-express.

Я исправил это, выполнив следующее (используя машинопись, поэтому просто игнорируйте биты любого типа)

const appModule = require('./App');
let server: any = undefined;

appModule.then((expressApp: any) => {
  server = createServer(expressApp, null, binaryMimeTypes);
});

function waitForServer(event: any, context: any){
  setImmediate(() => {
    if(!server){
      waitForServer(event, context);
    }else{
      proxy(server, event, context);
    }
  });
}

exports.handler = (event: any, context: any) => {
  if(server){
    proxy(server, event, context);
  }else{
    waitForServer(event, context);
  }
}

Так что для вашего кода может быть что-то вроде

var client = undefined;

initSecrets("MyWebApi").then(result => {
    var secret = JSON.parse(result.Payload);
    client= new MyWebApiClient(secret.API_KEY, secret.API_SECRET)
})

function waitForClient(){
  setImmediate(() => {
    if(!client ){
      waitForClient();
    }else{
      client('Request')
    }
  });
}

exports.handler = async function (event, context) {
  if(client){
    client('Request')
  }else{
    waitForClient(event, context);
  }
};

0
ответ дан Will 18 March 2019 в 18:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: