【问题标题】:Mongoose schema model returning empty array using Model.find() in dockerMongoose 模式模型在 docker 中使用 Model.find() 返回空数组
【发布时间】:2021-06-05 18:22:52
【问题描述】:

我正在使用 MongoDB 通过nodemongoose 为我的应用程序提供数据。我为model 创建了一个名为ReportSchema 的架构,然后我导入model 以将其用作Report 用于像Report.find() 这样的服务器请求。我还通过名为reports 的数据库在MongoDB 中创建了一些数据,并且在MongoDB 中一切正常。但是我得到一个空数组而不是我创建的数据。我查看了其他 SO 答案,但没有一个有效,例如更改集合名称、复数等。

我通过 docker 容器即服务来完成所有这些工作。

我不知道我是否遗漏了 dockermongoosenode 中的某些内容。请问,谁能给我一些指导?

谢谢!

MongoDB 外壳

use reports

db.reports.insert({
  stepName: 'Step one',
  stepType: 'Milestone',
  description: 'Some phase to complete.',
  addToReport: false,
  date: new Date(),
});

Mongoose 架构

import { Schema, Document, model } from 'mongoose';

export interface Report extends Document {
  stepName: string;
  stepType: string;
  description: string;
  addToReport: boolean;
  date: Date;
}

export const ReportSchema = new Schema(
  {
    stepName: String,
    stepType: String,
    description: String,
    addToReport: Boolean,
    date: { type: Date, default: Date.now },
  },
  {
    timestamps: true,
  }
);

export default model<Report>('report', ReportSchema, 'reports');

节点

import express, { Express, Request, Response } from 'express';
import cors from 'cors';
import bodyParser from 'body-parser';
import mongoose from 'mongoose';

import Report from '../db/models';
import connection from './connection';

const app: Express = express();

const PORT: string | number = process.env.PORT || 7004;
const DB_NAME: string = 'reports';
const DB_URI: string = `mongodb://root:password@mongodb-service:27017/${DB_NAME}?authSource=admin`;

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

// GET reports
app.get('/reports', async (req: Request, res: Response) => {
  try {
    const reports = await Report.find(); // --> this returns empty array, even though data exist.
    res.status(200).json({ reports });
  } catch (error) {
    res.json({ error, errormessage: 'Error fetching reports!' });
  }
});

app.use(cors());

const connection = async (app: Express): Promise<void> => {
  try {
    await mongoose.connect(DB_URI, {
        useNewUrlParser: true,
        useUnifiedTopology: true,
    });

    await app.listen(PORT, () => {
        console.log(`Reporrs app running on port ${PORT}.`);
    });
  } catch (error) {
    throw new Error('DB_CONN_ERROR:::' + error);
  }
};

// connection to mongo with mongoose
connection(app);

Dockerfile

FROM node:12
COPY . /opt/app
WORKDIR /opt/app
RUN yarn
CMD yarn watch

Docker-compose

version: '3'
services:
  reports-service:
    build: './reports-service'
    ports:
      - 7004:7004
    volumes:
      - ./reports-service:/opt/app

  mongodb:
    image: mongo:latest
    environment:
      - MONGO_INITDB_ROOT_USERNAME=root
      - MONGO_INITDB_ROOT_PASSWORD=password
    ports:
      - 27017:27017
    volumes:
      - mongodb_data_container:/data/db

volumes:
  mongodb_data_container:

【问题讨论】:

    标签: node.js mongodb typescript docker mongoose


    【解决方案1】:

    试试const reports = await Report.find({}).exec();

    【讨论】:

    • map 完全是多余的,只会增加复杂性。 res.status(200).json({ reports }); 无论如何都会将它们转换为 POJO。
    • 很高兴知道。我会更新我的答案以排除它。
    • 另一种将文档转换为普通对象的方法是Report.find().lean()
    • 谢谢@cseitz,但即使有你的解决方案,我仍然得到一个空数组。连接似乎也很好,但我不确定问题是否与我的 Dockerfile 和 docker-compse 的设置方式有关;或者我没有正确引用该集合。你有什么想法吗?
    • 如果你想使用 Compass,你不能使用mongodb-service:27017。这仅适用于与同一 docker 网络中的某些内容的连接。请改用localhost:27017
    猜你喜欢
    • 2021-10-22
    • 2015-02-07
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2017-06-07
    • 2020-01-02
    • 2021-03-29
    相关资源
    最近更新 更多