不使用无服务器框架在 Lambda 函数内部调用 Algolia saveObject
Algolia saveObject not called inside Lambda function using Serverless framework
我正在使用 Lambda 函数将记录索引到 Algolia。我可以通过 event
对象获取数据。我 运行 遇到了一个问题,Algolia 的 saveObject
函数似乎没有调用,或者它 returns 在完成它正在做的事情之前。也很难调试,因为我每次都必须查看 cloudwatch。我在这里和那里扔了一些 console.log
s 来查看流程是否正确。我有点被困在这里。非常感谢任何帮助。
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));
}
};
我正在使用 Lambda 函数将记录索引到 Algolia。我可以通过 event
对象获取数据。我 运行 遇到了一个问题,Algolia 的 saveObject
函数似乎没有调用,或者它 returns 在完成它正在做的事情之前。也很难调试,因为我每次都必须查看 cloudwatch。我在这里和那里扔了一些 console.log
s 来查看流程是否正确。我有点被困在这里。非常感谢任何帮助。
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));
}
};