1

我正在尝试使用 Fastify 和 fastify-monogdb。目前我有以下...

在我的/src/index.js

const routes = require("./routes");
const fastify = require("fastify")({
  logger: true
});

routes.forEach((route, index) => {
  fastify.route(route);
});

fastify.register(require("fastify-mongodb"), {
  url: "mongodb://localhost:27017/parkedcars"
});

const startFastify = async () => {
  try {
    await fastify.listen(3333);
    fastify.log.info(`server listening on ${fastify.server.address().port}`);
  } catch (err) {
    fastify.log.error(err);
    process.exit(1);
  }
};

startFastify();

在我的/routes/index.js我有一条路线...

const carController = require("../controllers/carController");

  {
    method: "POST",
    url: "/api/create/parkedcar",
    handler: carController.createParkedCar
  }

最后在我的/controllers/carController ...

const fastify = require("fastify")();

  exports.createParkedCar = async (req, reply) => {
  try {
    let car = { ...req.body };
    const db = fastify.mongo.db
    *// will do insert here*
    return car;
  } catch (err) {
    throw boom.boomify(err);
  }
};

当我尝试调用时:
const db = fastify.mongo.db

我收到一条错误消息...
“无法读取未定义的属性 'db'”

我在这里做错了什么?在这一点上mongo
是如何未定义的? “fastify.register”不是让我可以访问吗?

4

1 回答 1

2

您需要在每个应用程序中require("fastify")() 只做一次,因为它是工厂而不是单例,所以每次运行 require 时,您都在创建一个全新的 HTTP 服务器!

神奇的是在处理程序.register中以正确的方式使用和/或使用function而不是箭头函数。

对于您的用例,您可以更改 carController:

  exports.createParkedCar = function handler (req, reply) {
    let car = { ...req.body };
    const db = this.mongo.db
    *// will do insert here*
    db.insert(...)
      .then(() => reply.send(car))
      .catch((err) => reply.send(boom.boomify(err)))
  }

因为所有的函数处理程序,在 fastify 中,都绑定到了 fastify 服务器实例(像这样aFunction.bind(fastify))。箭头函数不能绑定。

另一种选择是使用寄存器:

// /routes/index.js

module.exports = (fastify, opts, next) => {

  fastify.route({
    method: "POST",
    url: "/api/create/parkedcar",
    handler: async (req, reply) => {
      try {
        let car = { ...req.body };
        const db = fastify.mongo.db
        *// will do insert here*
        return car;
      } catch (err) {
        throw boom.boomify(err);
      }
  });

  next() // dont forget it
}

有关更多信息,请查看文档

于 2019-11-18T16:28:44.660 回答