【发布时间】:2021-03-30 13:12:28
【问题描述】:
我正在尝试从 AWS lambda 函数访问 Airtable。
首先,为了测试,我在本地项目中安装了 airtable.js (npm install -s airtable),编写了一个简短的测试脚本,并使用node test.js 执行。一切正常。
在适当的 node.js 函数包装器中使用完全相同的核心测试代码,我尝试在 AWS lambda 函数中运行相同的测试,但我的 CloudWatch 日志中出现错误:
Error: Cannot find module '/var/task/node_modules/abort-controller/dist/abort-controller'. Please verify that the package.json has a valid \"main\" entry
我已经尝试使用部署包中的功能代码压缩 npm 包,还尝试从 airtable 包创建 lambda 层。两者都产生相同的错误。请注意,包裹已被拾取 - 如果我尝试使用层方法,但移除层本身,则它无法找到空气表。因此,这似乎与 airtable 包尝试访问 abort-controller 的方式有关。
对于它的价值,这是我在 lambda 函数中使用的 [已编辑] 测试代码:(返回等是因为它在 API 网关调用之后运行 - 但这不是问题的一部分,因为同样的错误无论是在 lambda 控制台内测试还是通过 API 调用都会发生)
var AWS = require("aws-sdk");
AWS.config.update({ region: "eu-west-1", });
const Airtable = require('airtable');
const base = new Airtable({ apiKey: "xxxxx" }).base('yyyyy');
exports.handler = async(event) => {
try {
console.info('trying create');
let records = await base('Base1').create([{
"fields": {
"Status": "Scored",
"C1": "testing",
"C2": "airtable",
"C3": "api",
"C4": "from",
"C5": "node",
}
}, ]);
console.info('completed create');
let records_list = records.map(r => r.getId()).join(',');
console.info(records_list);
return ({statusCode: 200, body: JSON.stringify(records_list)});
} catch (e) {
console.error(e);
return ({statusCode: 401, body: JSON.stringify(e)});
}
}
我之前构建了许多 lambda,包括层和嵌入式包,因此我犯了大部分常见错误 - 我不认为我在这里重复它们。 airtable.js 有什么特别之处,这意味着这里需要不同的方法吗?
【问题讨论】:
标签: node.js amazon-web-services aws-lambda airtable aws-lambda-layers