Express.js: лучший способ заполнить таблицу mongodb при запуске - PullRequest
0 голосов
/ 24 октября 2018

Я пришел в Node.js (Express.js) из Ruby on Rails.И там было довольно легко вносить любые изменения в db с помощью миграций.

Моя основная идея: у меня есть таблица, подобная словарю (поэтому некоторые из ключей: значения должны быть предварительно заполнены один раз при запуске, если нет значенийв этой таблице).

У меня есть две модели:

Maintenance и MaintenanceType.

Maintenance использует MaintenanceType через ref.

Модель технического обслуживания:

const mongoose = require("mongoose");
mongoose.Promise = global.Promise;
const MaintenanceType = mongoose.model("MaintenanceType");

const maintenanceSchema = new mongoose.Schema(
  {
    number: {
      type: String,
      trim: true,
      uppercase: true,
      required: "enter a maintenance number"
    },
    maintenanceType: {
        type: mongoose.Schema.ObjectId,
        ref: "MaintenanceType"
    },
    description: {
      type: String,
      trim: true,
      required: "enter a maintenance description"
    }
  },
  {
    toJSON: { virtuals: true },
    toObject: { virtuals: true }
  }
);

maintenanceSchema.index({
  number: "text"
});

module.exports = mongoose.model("Maintenance", maintenanceSchema);

Модель технического обслуживания:

const mongoose = require("mongoose");
mongoose.Promise = global.Promise;

const maintenanceTypeSchema = new mongoose.Schema(
    {
        name: {
            type: String,
            trim: true,
            required: "enter a maintenanceType name",
            unique: "enter a unique maintenanceType name",
        },
        isDefault: {
            type: Boolean,
            default: false
        }
    },
    {
        toJSON: { virtuals: true },
        toObject: { virtuals: true }
    }
);

// Define our indexes
maintenanceTypeSchema.index({
    number: "text"
});

module.exports = mongoose.model("MaintenanceType", maintenanceTypeSchema);

start.js:

const mongoose = require("mongoose");

// import environmental variables from variables.env file
require("dotenv").config({ path: "variables.env" });

mongoose.connect(process.env.DATABASE);
mongoose.Promise = global.Promise;
mongoose.connection.on("error", err => {
  console.error(`? → ${err.message}`);
});

require("./models/MaintenanceType");
require("./models/Maintenance");

const app = require("./app");
app.set("port", process.env.PORT || 7777);
const server = app.listen(app.get("port"), () => {
  console.log('started');
});

Итак: запустить сервер -> если таблица 'MaintenanceType' не имеет значений по умолчанию -> добавить некоторые значения по умолчанию (если их нет, например: [{name: 'wheels', isDefault: true}, {name: 'engine', isDefault: true}])

Я думал о app.listen разделе.Но, может быть, это не лучшее место для действий .find & .create bulk?

1 Ответ

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

Взгляните на это Каков наилучший способ заполнения приложения Node / MongoDB? .Это может помочь.

Другой подход заключается в том, чтобы сделать это вручную, например, проверить, есть ли элементы в коллекции MaintenanceType, если нет, вставить начальные значения.Посмотрите на код ниже.Предполагая, что вы используете запрос get для перехода на главную страницу / страницу индекса.

routes.get('/', (request, response) => {
    let initialValues = [{name: 'wheels', isDefault: true}, {name: 'engine', isDefault: true}];

    MaintenanceType.find({}, (error, doc) => {
        if (doc.length === 0) {
            let maintenanceType = new MaintenanceType(initialValues);

            maintenanceType.save(error => {

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