Ошибка Mongoose - модели Mongoose с одинаковым названием - PullRequest
0 голосов
/ 04 октября 2018

Я работаю над приложением NodeJs и использую пакет узлов mongoose.

Пример кода

Я использую следующий метод для создания динамических коллекций, и эти коллекции иногда не сохраняют данныев базе данных -

const Mongoose = require("mongoose");

const Schema = new Mongoose.Schema({
    // schema goes here
});

module.exports = function (suffix) {
    if (!suffix || typeof suffix !== "string" || !suffix.trim()) {
        throw Error("Invalid suffix provided!");
    }
    return Mongoose.model("Model", Schema, `collection_${suffix}`);
};

Я использую этот экспортированный модуль для создания динамических коллекций на основе уникальных идентификаторов, переданных в качестве параметра suffix.Как-то так (пропуская ненужный код) -

const saveData = require("./data-service");
const createModel = require("./db-schema");

// test 1
it("should save data1", function (done) {
    const data1 = [];
    const response1 = saveData(request1); // here response1.id is "cjmt8litu0000ktvamfipm9qn"
    const dbModel1 = createModel(response1.id);
    dbModel1.insertMany(data1)
        .then(dbResponse1 => {
            // assert for count
            done();
        });
});

// test 2
it("should save data2", function (done) {
    const data2 = [];
    const response2 = saveData(request2); // here response2.id is "cjmt8lm380006ktvafhesadmo"
    const dbModel2 = createModel(response2.id);
    dbModel2.insertMany(data2)
        .then(dbResponse2 => {
            // assert for count
            done();
        });
});

Проблема

Проблема в том, что тест 2 не пройден!Если API insertmany приводит к 0 записям, которые не соответствуют количественному утверждению.

Если мы поменяем местами порядок тестов, тест 1 не пройдёт.

Если я выполню два теста по отдельности,оба пройдут.

Если будет n тестов, пройдет только первый тест, а остальные не пройдут.


Выводы

Я подозревал, что mongoose model creation step будетнеисправен, поскольку он использует то же имя модели, а именно.Model при создании нескольких экземпляров модели.

Я изменил его на следующий, и тесты отлично работали во всех сценариях -

return Mongoose.model(`Model_${suffix}`, Schema, `collection_${suffix}`);

Вопросы

Это оставляет меня сследующие вопросы -

  • Соблюдаю ли я правильные соглашения о кодировании при создании динамических коллекций?
  • Является ли подозрительный код фактической причиной этой проблемы (если имя модели также должно быть уникальным)?
  • Если да, то почему это не получается?(Я следовал за mongoose docs , но он не предоставляет никакой информации относительно уникальности аргумента имени модели.

Спасибо.

1 Ответ

0 голосов
/ 04 октября 2018

Если вы вызываете метод insertMany для dbModel1, где ваша переменная объявлена ​​как dbModel2.

Измените ваш тест 2 с:

dbModel1.insertMany(data2)
        .then(dbResponse1 => {
            // assert for count
            done()
        });

На:

dbModel2.insertMany(data2)
        .then(dbResponse1 => {
            // assert for count
            done()
        });
...