在另一个 fastify 之后加载插件
Load plugin after another fastify
我目前正在开发 api 自动加载插件的功能,但我想在所有路由上添加全局挂钩。
我目前正在做的是加载我所有的插件,在我加载我的中间件之后,但我遇到了问题
我正在尝试使用 mongoClient created by fastify-mongo 但我总是以错误 mongo is not defined.
结束
当我在我的控制器上使用它时一切正常我认为我得到这个错误是因为插件没有完全加载,我确实找到了 .ready 但它不起作用
plugin/mongo.js
import fp from 'fastify-plugin';
import mongoPl from '@fastify/mongodb';
async function mongo(fastify, opts) {
fastify.register(mongoPl, {
forceClose: true,
url: 'mongodb://mongo:27017'
});
}
export default fp(mongo, {
name: 'mongo'
});
libs/middleware
import fp from "fastify-plugin";
async function hooks(fastify, opts) {
fastify.addHook('onRequest', (req, res, done) => {
// Inject mongo client
mongoClient(req);
done();
});
}
async function mongoClient(req){
try {
req.db = this.mongo.client.db('db-name');
}catch (e) {
console.error(e);
}
}
export default fp(hooks, {
name: 'hooksMiddleware'
});
app.js
app.register(AutoLoad, {
dir: join(import.meta.url, 'plugins'),
options: Object.assign({})
}).after(() => {
app.register(hooksMiddleware, {});
});
您的设置看起来不错,但是 mongoClient
函数中的 this
上下文是 undefined
。
这里有一些修复:
async function hooks(fastify, opts) {
fastify.addHook('onRequest', (req, res, done) => {
// Inject mongo client
mongoClient.call(fastify, req);
done();
});
}
或者:
async function hooks(fastify, opts) {
// NOTE: I changed from arrow to an anonymous function
fastify.addHook('onRequest', function (req, res, done) {
// Inject mongo client
mongoClient.call(this, req);
done();
});
}
你需要知道:
this
上下文仅在您提供给 Fastify 的那些 named 函数上设置。 mongoClient
函数只是 Fastify 控制之外的一个函数
- 无法为箭头函数设置
this
上下文 。 (意见)我永远不会停止说:仅对 1 行函数使用箭头函数,否则命名函数 始终 是最佳选择(更好的堆栈跟踪,更具可读性)
我目前正在开发 api 自动加载插件的功能,但我想在所有路由上添加全局挂钩。 我目前正在做的是加载我所有的插件,在我加载我的中间件之后,但我遇到了问题 我正在尝试使用 mongoClient created by fastify-mongo 但我总是以错误 mongo is not defined.
结束当我在我的控制器上使用它时一切正常我认为我得到这个错误是因为插件没有完全加载,我确实找到了 .ready 但它不起作用
plugin/mongo.js
import fp from 'fastify-plugin';
import mongoPl from '@fastify/mongodb';
async function mongo(fastify, opts) {
fastify.register(mongoPl, {
forceClose: true,
url: 'mongodb://mongo:27017'
});
}
export default fp(mongo, {
name: 'mongo'
});
libs/middleware
import fp from "fastify-plugin";
async function hooks(fastify, opts) {
fastify.addHook('onRequest', (req, res, done) => {
// Inject mongo client
mongoClient(req);
done();
});
}
async function mongoClient(req){
try {
req.db = this.mongo.client.db('db-name');
}catch (e) {
console.error(e);
}
}
export default fp(hooks, {
name: 'hooksMiddleware'
});
app.js
app.register(AutoLoad, {
dir: join(import.meta.url, 'plugins'),
options: Object.assign({})
}).after(() => {
app.register(hooksMiddleware, {});
});
您的设置看起来不错,但是 mongoClient
函数中的 this
上下文是 undefined
。
这里有一些修复:
async function hooks(fastify, opts) {
fastify.addHook('onRequest', (req, res, done) => {
// Inject mongo client
mongoClient.call(fastify, req);
done();
});
}
或者:
async function hooks(fastify, opts) {
// NOTE: I changed from arrow to an anonymous function
fastify.addHook('onRequest', function (req, res, done) {
// Inject mongo client
mongoClient.call(this, req);
done();
});
}
你需要知道:
this
上下文仅在您提供给 Fastify 的那些 named 函数上设置。mongoClient
函数只是 Fastify 控制之外的一个函数- 无法为箭头函数设置
this
上下文 。 (意见)我永远不会停止说:仅对 1 行函数使用箭头函数,否则命名函数 始终 是最佳选择(更好的堆栈跟踪,更具可读性)