如何将 KeystoneJs 与 Sentry.io 集成
How to integrate KeystoneJs with Sentry.io
之前用Sentry集成过其他平台的项目,还是比较简单的。但是此时,我使用的是 KeystoneJs,它是在 Express 之上创建的。
Sentry 提供此教程让 Express 用户将他们的应用程序与 Sentry 集成:https://sentry.io/for/express/
但我不清楚如何将它应用于 KeystoneJs 项目,因为我们不能只调用 keystone.use()
我知道我们在 keystone 上有一些可用的钩子,所以我也尝试了这个:
const Sentry = require('@sentry/node');
Sentry.init({ dsn: 'https://a43847aba49b41d69b87793e01c008ae@sentry.io/1301672' });
keystone.set('pre:routes', Sentry.Handlers.requestHandler());
keystone.set('pre:routes', Sentry.Handlers.errorHandler());
这导致了这个错误:
TypeError: next is not a function
at sentryErrorMiddleware (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/@sentry/node/src/handlers.ts:268:5)
at createApp (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/keystone/server/createApp.js:119:29)
at Keystone.initExpressApp (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/keystone/lib/core/initExpressApp.js:9:47)
at Keystone.start (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/keystone/lib/core/start.js:47:7)
at Object.<anonymous> (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/keystone.js:69:10)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at loader (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/babel-register/lib/node.js:144:5)
at Object.require.extensions.(anonymous function) [as .js] (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/babel-register/lib/node.js:154:7)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at Object.<anonymous> (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/babel-cli/lib/_babel-node.js:154:22)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
我想知道集成 Keystone 和 Sentry 的最佳方法,但我找不到任何地方。如果以前有人做过这个,请告诉我!
接下来我会尝试将一个单独的 Express 应用程序添加到项目中,并 link 使用 keystone 将其添加,如下所述:https://github.com/keystonejs/keystone/wiki/How-to-Add-Keystone-to-an-Already-Existing-Express-App
由于这不完全是我的情况,我不确定这是最好的方法还是只是想办法将正则表达式 app.use()
与 KeystoneJs 一起使用。
回答我自己的问题。无需为此添加新的 Express 应用程序。我所要做的就是使用 keystone.set()
而不是 app.use()
.
唯一需要注意的是:当直接使用 Express 时,你可以在使用 keystone 时添加几个错误处理中间件,我已经有类似 keystone.set('500', myCustomErrorHandlingMiddleware);
的东西了
所以我将使用 sentry.Handlers.errorHandler()
的代码移到了其中。
之前用Sentry集成过其他平台的项目,还是比较简单的。但是此时,我使用的是 KeystoneJs,它是在 Express 之上创建的。
Sentry 提供此教程让 Express 用户将他们的应用程序与 Sentry 集成:https://sentry.io/for/express/
但我不清楚如何将它应用于 KeystoneJs 项目,因为我们不能只调用 keystone.use()
我知道我们在 keystone 上有一些可用的钩子,所以我也尝试了这个:
const Sentry = require('@sentry/node');
Sentry.init({ dsn: 'https://a43847aba49b41d69b87793e01c008ae@sentry.io/1301672' });
keystone.set('pre:routes', Sentry.Handlers.requestHandler());
keystone.set('pre:routes', Sentry.Handlers.errorHandler());
这导致了这个错误:
TypeError: next is not a function
at sentryErrorMiddleware (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/@sentry/node/src/handlers.ts:268:5)
at createApp (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/keystone/server/createApp.js:119:29)
at Keystone.initExpressApp (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/keystone/lib/core/initExpressApp.js:9:47)
at Keystone.start (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/keystone/lib/core/start.js:47:7)
at Object.<anonymous> (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/keystone.js:69:10)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at loader (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/babel-register/lib/node.js:144:5)
at Object.require.extensions.(anonymous function) [as .js] (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/babel-register/lib/node.js:154:7)
at Module.load (internal/modules/cjs/loader.js:599:32)
at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
at Function.Module._load (internal/modules/cjs/loader.js:530:3)
at Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
at Object.<anonymous> (/Users/ronconi/Workspaces/OfficePools/victoria-royals-api/src/node_modules/babel-cli/lib/_babel-node.js:154:22)
at Module._compile (internal/modules/cjs/loader.js:689:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
at Module.load (internal/modules/cjs/loader.js:599:32)
我想知道集成 Keystone 和 Sentry 的最佳方法,但我找不到任何地方。如果以前有人做过这个,请告诉我!
接下来我会尝试将一个单独的 Express 应用程序添加到项目中,并 link 使用 keystone 将其添加,如下所述:https://github.com/keystonejs/keystone/wiki/How-to-Add-Keystone-to-an-Already-Existing-Express-App
由于这不完全是我的情况,我不确定这是最好的方法还是只是想办法将正则表达式 app.use()
与 KeystoneJs 一起使用。
回答我自己的问题。无需为此添加新的 Express 应用程序。我所要做的就是使用 keystone.set()
而不是 app.use()
.
唯一需要注意的是:当直接使用 Express 时,你可以在使用 keystone 时添加几个错误处理中间件,我已经有类似 keystone.set('500', myCustomErrorHandlingMiddleware);
所以我将使用 sentry.Handlers.errorHandler()
的代码移到了其中。