将Sentry添加到AWS Lambda,如何在本地运行它?

问题描述 投票:0回答:1

我在节点中创建了一个 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
,但是我不知道如何在本地运行时提供它们。

我哪里出错了有什么提示/建议吗?

node.js typescript aws-lambda promise sentry
1个回答
0
投票

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);

© www.soinside.com 2019 - 2024. All rights reserved.