如何在 Firebase Cloud Function 可调用堆栈跟踪中显示 TypeScript 源?

And*_*iak 6 firebase typescript google-cloud-logging google-cloud-functions

我有一组云函数,它们执行类似 CRUD 的函数来获取单个资源、列出资源等等getWidgetByURL,,,, listWidgetsdeleteWidget

对于更广泛的上下文,它们被编写在单个src/service.ts文件中并src/index.ts公开一组可调用对象:

import * as functions from 'firebase-functions'
import * as service from './service'

const region = 'europe-west1'

exports.addJob = functions.region(region).https.onCall(async (data, context) => {
  try {
    functions.logger.debug('addJob called with data', data)
    const job = await service.addJob(data.title, data.company,
      data.location, data.applyUrl, data.salary, data.tags)
    return job
  } catch (err) {
    functions.logger.error(err)
    throw new functions.https.HttpsError('internal', 'internal server error', err)
  }
})
Run Code Online (Sandbox Code Playgroud)

在开发周期中,我npm run build在本地运行以将 JavaScript 编译到目标lib目录中。请注意*.map文件已生成。

在此输入图像描述

在生产中,如果发生运行时错误,Firebase 控制台日志中显示的堆栈跟踪仅显示 .js 文件调用堆栈。

在此输入图像描述

调试过程涉及必须在本地lib/service.js文件中找到运行时错误,然后手动在相应的源代码lib/service.ts文件中找到相应的行。乏味。

堆栈跟踪是否可以自动利用 .map 文件来生成更有用的东西?如果不是,最佳实践/工作流程是什么?

Sei*_*Day 7

我们为此使用node-source-map-support 。几分钟前我尝试过,效果很好。

假设您正在使用 NPM,请运行npm install source-map-support. (--save-dev当然不是,您在运行时需要它)。

在index.ts中,尽早导入source-map-support/register,最好是第一件事,如下所示:

// index.ts
import "source-map-support/register";
Run Code Online (Sandbox Code Playgroud)

如何编译并不重要。据我所知,调用实际上只需要在主模块中发生,并且它编译得足够早,足以让奇迹发生。

现在,测试一下!根据此 Firebase 文档,只要logger.error调用包含Error对象,我们就会获得堆栈打印输出(方便测试)。像这样记录错误,然后:

// foo.ts
import * as functions from "firebase-functions";
const { logger } = functions;

...

const error = new Error("This should log.");
logger.error(error);
Run Code Online (Sandbox Code Playgroud)

这将从foo.ts 中的第83行编译到foo.js 中的第 54行。

一旦触发,我们就会在 Firebase 函数控制台中看到:

在此输入图像描述

正如您所看到的,文件名和行号正确指向.ts源文件的第 83行!

由于这与日志记录有关,因此我应该注意,因为我们在 Node.js 10 运行时上使用 Firebase Cloud Functions,所以旧console.log语法有点诡异。因此,在我们的 tsconfig.json 文件中,我们需要使用lib: ["es2018"], target: "es2018",但我们还需要使用functions.logger.*来获得与使用 时相同的行为console.*。像往常一样,扔掉任何旧Error物体也可以。

我发现这篇文章对于 Node.js 10 迁移很方便。我会将其包含在此处,以防最终与您相关。


Dou*_*son 5

您可以使用模块source-map-support。只需使用 npm 安装模块,然后将一行代码放在 index.js 的顶部。

require('source-map-support').install();
Run Code Online (Sandbox Code Playgroud)