【问题标题】:Nodejs API init behavior when using multiple module requires使用多个模块时的 Nodejs API 初始化行为需要
【发布时间】:2021-02-18 18:21:19
【问题描述】:

我在几个节点模块中使用 Sentry。我在admin.js中初始化它:

// admin.js
const Sentry = require('@sentry/node');

Sentry.init({
  dsn: functions.config().sentry.dsn,
  environment: functions.config().env.mode,
});

module.exports = { Sentry };

我知道节点是“需要一次”(第一次后缓存)并在此之后返回相同的对象,因此多个要求表现为一个要求。

我的问题与这些 require 语句的运行顺序有关,以及我是否应该在其他模块中使用下面的选项 #1 或 #2(或者是否重要):

// utils.js
// option #1
const Sentry = require('@sentry/node');

testFn () {
  try {
    throw new Error();
  } catch (err) {
    Sentry.captureException(err);
  }
}
// utils.js
// option #2
const { Sentry } = require('./admin');

testFn () {
  try {
    throw new Error();
  } catch (err) {
    Sentry.captureException(err);
  }
}

如果我使用选项#1,当调用captureException 时,Sentry 是否有可能无法在utils.js 中正确初始化?

如果这两个选项都有效,那么就最佳实践而言,一个比另一个更受欢迎吗?

【问题讨论】:

  • 只有选项 2 是正确的。 admin 未在选项 1 中导入。
  • 谢谢。要清楚,您是说虽然哨兵在 admin.js 中被初始化,但如果使用选项 1,哨兵将无法在 utils.js 中工作?
  • 如果在导入 utils 的模块中未在 utils 之前导入 admin,则不会,如果 admin 是,则不会。这种不确定性表明存在问题。如果 utils 依赖于 admin 的代码并且需要它正常工作,它应该显式地导入它。
  • 这正是我需要知道的。这很有意义。非常感谢!

标签: javascript node.js firebase google-cloud-functions sentry


【解决方案1】:

最好在你的应用根目录中初始化 sentry,例如,如果你使用express,你可以在主 server.js 文件中初始化,也可以使用 sentry 提供的中间件。类似:

const Sentry = require('@sentry/node');
const express = require('express');

Sentry.init({
  dsn: 'DSN',
  environment: 'ENV',
  release: DEPLOY_VERSION || 'n/a',
  ignoreErrors: [
    'Network request failed',
    'Failed to fetch',
    'NetworkError',
    'withrealtime/messaging',
  ],
});

// Create our express app using the port optionally specified
export const app = express();

// The request handler must be the first middleware on the app
app.use(Sentry.Handlers.requestHandler());

// The error handler must be before any other error middleware
app.use(Sentry.Handlers.errorHandler());

app.disable('x-powered-by');


app.get('/', (req, res) => {
  res.send('Hello World!')
})

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

如果您想在您的应用中获取自定义错误日志,您可以将Sentry 变量放入您的req 变量中。某事喜欢:

app.get('/', (req, res) => {
  req.sentry = Sentry;
  res.send('Hello World!')
});

但这不是必需的。因为哨兵实例是请求之间的共享变量,并且初始化一次,将存储在内存中并适用于所有并发请求

【讨论】:

  • 我刚刚添加了一些标签来表明我在谷歌云功能环境中。这不是一个快速的应用程序,对不起。你的建议是有道理的,但这不是我的情况。
猜你喜欢
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2011-06-21
  • 2012-09-03
  • 1970-01-01
  • 2014-11-23
相关资源
最近更新 更多