在另一个 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 行函数使用箭头函数,否则命名函数 始终 是最佳选择(更好的堆栈跟踪,更具可读性)