Как получить доступ к mongodb через плагин fastify-mongodb

#mongodb #fastify

Вопрос:

Мой плагин выглядит так

 import fp from 'fastify-plugin';
import mongodb from 'fastify-mongodb';

export default fp(async (fastify) => {
  fastify.register(mongodb, {
    url: 'mongodb srv://dbuser:password@cluster0.otigz.mongodb.net/myapp?retryWrites=trueamp;w=majority',
  });
});
 

и мой куратор выглядит так

 const postJoinHandler = async (
  request: any,
  reply: any
): Promise<{ id: string; name: string }> => {
  try {
    const { username, password } = request.body; 

    const test = await reply.mongo.db.users.insertOne({
      username,
      password,
    });
    console.log(test);

    return reply.code(201).send(username);
  } catch (error) {
    request.log.error(error);
    return reply.send(400);
  }
};
 

Ожидал, что он вставит имя пользователя и пароль в коллекцию именованных пользователей, но этого не произошло? и ошибка в том, что Cannot read property 'db' of undefined

Я тоже пытался

 reply.mongodb.users.insertOne({...
 

и

     const test = await request.mongodb.collection('users');

    test.insertOne({
      username,
      password,
    });
    console.log(test);
 

и

 const test = await this.mongo.db.collection('users'); //<= Object is possibly 'undefined'
 

Маршруты выглядят так

 import { FastifyPluginAsync } from 'fastify';
import { postJoinSchema, postLoginSchema } from '../schemas/auth';

const auth: FastifyPluginAsync = async (fastify): Promise<void> => {
  fastify.post('/auth/join', postJoinSchema);
  fastify.post('/auth/login', postLoginSchema);
};

export default auth;
 

Ответ №1:

mongo Декоратор прикреплен к fastify экземпляру, а не к объекту request nor reply .

Вам следует переместить обработчики в файл маршрутов и прочитать fastify.mongo или использовать именованную функцию в качестве обработчика.

В последнем случае обработчик this привязан к fastify экземпляру.

 async function postJoinHandler (
  request,
  reply
) {
  try {
    const { username, password } = request.body; 

    const test = await this.mongo.db.users.insertOne({
      username,
      password,
    });
    console.log(test);

    reply.code(201)
    return username
  } catch (error) {
    request.log.error(error);
    reply.code(400);
    return {}
  }
};
 

Комментарии:

1. Теперь я получаю эту ошибку «ошибка TS2683:» это «неявно имеет тип «любой», потому что у него нет аннотации типа». и «Внешнее значение» это «затенено этим контейнером».

2. Это проблема TS. Я не разработчик машинописных текстов