Пн goose ошибка запроса / схемы только в контейнере docker - PullRequest
6 голосов
/ 04 августа 2020

У меня есть база данных MongoDB, которую я запрашиваю с помощью Mon goose.

Я использую коллекцию audits для хранения информации об изменениях обновлений, неудачных попытках входа в систему и ошибках.

Модель аудита

const mongoose = require('mongoose');

mongoose.Promise = global.Promise;
const Schema = mongoose.Schema;

const auditSchema = new Schema({
  ref: {
    type: String,
    required: true
  },
  linkedId: {
    type: Schema.ObjectId,
    refPath: 'ref'
  },
  action: {
    type: String,
    enum: ['insert', 'update', 'delete', 'special']
  },
  /* ... lots more fields */
});

module.exports = mongoose.model('audit', auditSchema);

Запрашивая эту коллекцию в моем docker контейнере, используя запрос ниже:

return Audit.find().sort({date: -1})
  .skip(skipInt)
  .limit(limitInt)
  .populate('user')
  .populate('linkedId')
  .exec();

Я получаю следующую ошибку:

Schema hasn't been registered for model "error". Use mongoose.model(name, schema)

Нет схемы «error», однако я проверил, что все записи в коллекции с ошибкой ref не имеют заполненного linkedId:

{ref: 'error', linkedId: {$exists: true}} // 0 documents

Я не понимаю, почему это нормально работает в моей системе разработки (win 10, отладка vscode), но ошибки как в моем локальном docker, так и aws lamda.

Я запустил полная перестройка docker изображений, чтобы попытаться убедиться, что это не проблема кеширования, но ошибка остается.

редактировать

Пробовал два docker файлы, оба демонстрируют одинаковое поведение, построенные на машине windows 10

FROM node:8-alpine
WORKDIR /usr/app
COPY package.json .
RUN npm i --quiet
COPY . .
RUN npm install pm2 -g
CMD ["pm2-runtime", "./bin/www"]


FROM node:12
WORKDIR /tmp
RUN wget https://downloadarchive.documentfoundation.org/libreoffice/old/5.4.7.2/deb/x86_64/LibreOffice_5.4.7.2_Linux_x86-64_deb.tar.gz -O libo.tar.gz
RUN apt update \
  && apt install -y libxinerama1 libfontconfig1 libdbus-glib-1-2 libcairo2 libcups2 libglu1-mesa libsm6 unzip \
  && tar -zxvf libo.tar.gz
WORKDIR /tmp/LibreOffice_5.4.7.2_Linux_x86-64_deb/DEBS
RUN dpkg -i *.deb
WORKDIR /usr/app
COPY package.json .
RUN rm -rf node_modules
RUN npm install --arch=x64 --platform=linux sharp
RUN npm i --quiet
COPY . .
RUN npm install pm2 -g
CMD ["pm2-runtime", "./bin/www"]

редактировать 2

* 103 6 * Я думаю, что нашел разницу, но не решение, в контейнере отображается mon goose версия 5.9.28, но package. json перечислено ^5.8.3, обновление mongoose до версии 5.9.28 дает ту же ошибку при моя локальная установка, однако теперь я застрял с той же ошибкой и не знаю, как ее решить.

1 Ответ

1 голос
/ 17 августа 2020

Мне не известно о Docker или AWS Lambda , но я проверил ваш auditSchema и запрос простым Node.js express приложение и такая же ошибка воспроизводятся и на моем конце.

MissingSchemaError:Schema hasn't been registered for model "error". Use mongoose.model(name, schema)

Итак, проблема: свойство linkedId объявлено в auditSchema как refpath:ref, что означает будет заполняться из нескольких коллекций на основе значения свойства ref в документе. Поэтому, когда мы запрашиваем Audit.find().populate('linkedId'), он извлекает всю запись из коллекции Audit и заполняет linkedId для каждого документа. Если документ содержит значение ref:error, тогда mon goose попробуйте найти коллекцию error для совокупности, и у нас нет схемы ошибок или коллекции ошибок, поэтому это вызовет указанную выше ошибку.

Эта ошибка будет генерироваться для каждого документа в вашей коллекции Audit, поле ref которого также содержит значение, отличное от error. Пн goose необходимо наличие всей схемы / коллекции, которые вы указали как значение ref.

Чтобы решить эту проблему, вам необходимо определить коллекцию для каждого значения, которое вы предоставили в ref свойстве Audit документов

Пожалуйста, обратитесь к этому , чтобы узнать больше о refpath.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...