我在节点中创建了一个 AWS Lambda,可以像这样在本地运行:
exports.handler = async function () {
return await myFunction();
}
exports.handler();
我想将 Sentry 添加到此并已按照此处的说明进行操作,留下以下内容:
const Sentry = require("@sentry/serverless");
Sentry.AWSLambda.init({
dsn: "https://myURL.com",
// We recommend adjusting this value in production, or using tracesSampler
// for finer control
tracesSampleRate: 1.0,
});
exports.handler = Sentry.AWSLambda.wrapHandler(async (event, context) => {
return await myFunction();
});
exports.handler();
但是不幸的是,这将不再运行并出现以下错误(但它实际上会发送到 Sentry)。
This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). The promise rejected with the reason:
TypeError: Cannot set properties of undefined (setting 'callbackWaitsForEmptyEventLoop')
我怀疑这是因为额外的参数
event
和context
,但是我不知道如何在本地运行时提供它们。
我哪里出错了有什么提示/建议吗?
TypeError:无法设置未定义的属性(设置“callbackWaitsForEmptyEventLoop”)
当 Lambda 调用函数处理程序时,Lambda 运行时会将两个参数传递给函数处理程序:
event
context
事件对象包含来自调用者的信息。以最简单的方式,这是 Lambda 的输入。
上下文对象在运行时由 Lambda 传递给您的函数。上下文对象提供有关调用、函数和运行时环境的信息。
仅对于 Node.js 运行时,函数处理程序还支持第三个参数,即回调对象。
最初,AWS Lambda 仅支持回调模式来管理 JavaScript 中的异步操作。这就是回调参数存在的原因。然而,随着 2017 年 5 月 30 日 Node.js v8 的推出,情况发生了变化,它带来了对 async/await 语法的原生支持。在此开发之后,AWS Lambda 于 2018 年 4 月 2 日宣布支持 Node.js 8.10 运行时,从而扩展了对函数处理程序的异步/等待模式的支持。这消除了对回调函数的需要。 虽然您可能仍然会看到回调对象在今天运行的旧 Lambda 函数中使用,但它已不再需要。如今,Node.js 函数处理程序的推荐格式是仅包含
event
和
context
对象的格式(不过,这两者都不是严格必需的)。callbackWaitsForEmptyEventLoop
属性在
context
对象上设置。它定义了与回调相关的 Lambda 行为。由于您正在执行 Sentry.AWSLambda.wrapHandler(async (event, context)...
,它可能正在尝试读取上下文对象并失败,因为它是 undefined
。考虑到您没有传递回调,无论您将其设置为 true
还是
false
,对您来说都没有什么区别。我在这里看到 2 个解决方案。
首先,Sentry 不应该
需要你总是有一个event
和/或
context
对象。如果您不使用它们,请不要传递它们。试试这个:
...
exports.handler = Sentry.AWSLambda.wrapHandler(async () => {
return await myFunction();
});
exports.handler();
如果这引发了有关缺少上下文对象的错误,请创建一个模拟
context
对象并在手动调用 Lambda 函数时传递它。
const context = {
callbackWaitsForEmptyEventLoop: false
};
exports.handler = Sentry.AWSLambda.wrapHandler(async (event, context) => {
return await myFunction();
});
exports.handler(undefined, context);