不使用无服务器框架在 Lambda 函数内部调用 Algolia saveObject

Algolia saveObject not called inside Lambda function using Serverless framework

我正在使用 Lambda 函数将记录索引到 Algolia。我可以通过 event 对象获取数据。我 运行 遇到了一个问题,Algolia 的 saveObject 函数似乎没有调用,或者它 returns 在完成它正在做的事情之前。也很难调试,因为我每次都必须查看 cloudwatch。我在这里和那里扔了一些 console.logs 来查看流程是否正确。我有点被困在这里。非常感谢任何帮助。

search.js

'use strict';

const algoliasearch = require('algoliasearch');

const ALGOLIA_APP = 'appid';
const ALGOLIA_KEY = 'algoliakey';
const INDEX = 'indexname';

const connectToIndex = (appId,apiKey,index) => {
  const client = algoliasearch(appId,apiKey);
  return client.initIndex(index);
};

const updateIndex = async (record) => {
  console.log('updating/replacing') //logs in cloudwatch
  const index = connectToIndex(ALGOLIA_APP,ALGOLIA_KEY,INDEX);
  console.log(record,index); //logs the record object and index object in cloudwatch
  index.saveObject(record)
  .then(()=>{
    console.log('updated/replaced')  //doesn't log in cloudwatch + not indexed in algolia
    return;
  }
  ).catch((e) => {
    console.error(e);
    return;
  });
}

module.exports.algoliaIndexer = async (event, cb) => {
    try {
      const body = JSON.parse(event.Records[0].body);
      const record = {...restructuring body}; //record to index
      if (body.detail.operationType === 'update' || body.detail.operationType === 'replace'){
        updateIndex(record);
        console.log('done1') //logs in cloudwatch
      }
      console.log('done2') //logs in cloudwatch
      cb(null, responseObj('success', 200));
    } catch (e) {
      console.error(e);
      cb(null, responseObj(e.message, 500));
    }
  };

handler.js 包含 lambda 函数

'use strict';

const search = require('./lib/search');

let algoliaIndexer = (event, context, callback) => {
  context.callbackWaitsForEmptyEventLoop = false;
  search.algoliaIndexer(event, callback);
};

module.exports = {
  algoliaIndexer : algoliaIndexer 
}

编辑 我也尝试过 await updateIndex(record) 但没有成功

I'am running into a problem where the saveObject function of Algolia doesn't seem to call or it returns before finishing what it is doing.

这就是问题所在。您不会等待 saveObject 函数完成(return 结果)。为此,您需要 await 为您的 async 函数 return(这个概念称为 async/await)。

因此,尝试更改此行:

updateIndex(record);

await updateIndex(record);

这应该可以解决问题。

此外,您正在使用带有回调的 async 处理程序。这也可能会破坏某些东西。您可以使用 async 处理程序 回调,不能同时使用。

尝试以下处理程序签名:

module.exports.algoliaIndexer = async (event) {
  ... your code ...
}

相关文档:https://docs.aws.amazon.com/lambda/latest/dg/nodejs-handler.html

updateIndex 函数中使用 try catch 块结合 @Jens 的回答解决了我的问题。

search.js

const updateIndex = async (record) => {
  const index = connectToIndex(ALGOLIA_APP,ALGOLIA_KEY,INDEX);
  try{
    await index.saveObject(record);
  }
  catch(e){
    console.error(e);
  }
}

module.exports.algoliaIndexer = async (event, cb) => {
    try {
      const body = JSON.parse(event.Records[0].body);
      const record = {...restructuring body}; //record to index
      if (body.detail.operationType === 'update' || body.detail.operationType === 'replace'){
        await updateIndex(record);
      }
      cb(null, responseObj('success', 200));
    } catch (e) {
      console.error(e);
      cb(null, responseObj(e.message, 500));
    }
  };