Mongoose DB种子(节点/Express)
#database #mongodb #mongoose #mern

在开发过程中如何处理播种数据库?在开发过程中使用模拟数据时,您会不断地发现自己重置DB,清理或手动添加条目,最终才能再次清除它,等等...
如果听起来像您,这是一个小型应用程序,可以帮助您。

假设您有一个存储在服务器端的文件中的对象(模拟数据)。

const mockUsers = [
  {
    username: "fakemedic",
    email: "med@med.com",
    password: "$2b$10$h036pK1tWvpYRB3Evbq9j.nk57Zh.OwWtzHXTQhgBbaRhS4LIitsC",
    avatar:
      "https://images.unsplash.com/photo-1463453091185-61582044d556?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8cmFuZG9tJTIwcGVyc29ufGVufDB8fDB8fA%3D%3D&w=1000&q=80",
  },
  {
    username: "freesoul",
    email: "free@free.com",
    password: "$2b$10$h036pK1tWvpYRB3Evbq9j.nk57Zh.OwWtzHXTQhgBbaRhS4LIitsC",
    avatar:
      "https://images.unsplash.com/photo-1438761681033-6461ffad8d80?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8Mnx8cGVyc29ufGVufDB8fDB8fA%3D%3D&w=1000&q=80",
  },
  {
    username: "DaBom",
    password: "$2b$10$h036pK1tWvpYRB3Evbq9j.nk57Zh.OwWtzHXTQhgBbaRhS4LIitsC",
    email: "dabom@dabom.com",
    avatar:
      "https://images.unsplash.com/photo-1500648767791-00dcc994a43e?ixlib=rb-4.0.3&ixid=MnwxMjA3fDB8MHxzZWFyY2h8MzR8fHBlcnNvbnxlbnwwfHwwfHw%3D&w=1000&q=80",
  },
  {
    username: "lastcaique",
    email: "lastcaique@lastcaique.com",
    password: "$2b$10$h036pK1tWvpYRB3Evbq9j.nk57Zh.OwWtzHXTQhgBbaRhS4LIitsC",
    avatar:
      "https://st2.depositphotos.com/3143277/8644/i/600/depositphotos_86446164-stock-photo-business-man-in-office.jpg",
  },
];

为了使魔术实现,我们将使用process.argv

我亲自为我的播种机/清晰的seed.js命名文件。

让我们现在开始工作:

  1. 我们需要我们将使用的模拟数据以及Mongoose,Dotenv和模型。
const { mockUsers } = require("../db/mock_data");
const mongoose = require("mongoose");
require("dotenv").config();
const { User, Post } = require("../models/models");

2-存储一个连接:

const connection = async () => {
  mongoose.set("strictQuery", false);
  await mongoose
    .connect(process.env.DB_URI, { useNewUrlParser: true })
    .then(() => console.log("DB READY TO SEED"))
    .catch((err) => console.log(err));
};

3-现在我们创建了第一个功能,就我而言是种子。我们调用连接函数,然后在完成时简单地创建,退出过程:

const seedDB = async () => {
  await connection();
  await User.create(mockUsers)
    .then(() => console.log("Users seeded"))
    .catch((err) => console.log(err));

  process.exit();
};

4-到目前为止,没有什么新鲜的(希望)...因此,让我们创建另一个可以清除DB的功能:

const clearDB = async () => {
  await connection();
  await User.deleteMany()
    .then(() => console.log("Users deleted"))
    .catch((err) => console.log(err));

  process.exit();
};

5-最后,argv将处理这些功能,可以随意遵守。 您将获得一个带有索引0和1的路径的数组

node seed.js --my_flag

此日志将其标志为process.argv[2],允许我们在package.json上编写脚本进行播种并清除:

package.json:

  "scripts": {
    "start": "NODE_ENV=production node server/index.js",
    "dev": "nodemon server/index.js",
    "seedDB": "node server/db/seed.js --seedDB",
    "clearDB": "node server/db/seed.js --clearDB"
  },

最后:基于标志,我们将调用我们创建的函数:

if (process.argv[2] === "--seedDB") {
  seedDB();
} else if (process.argv[2] === "--clearDB") {
  clearDB();
}

完成!使用脚本进行种子并清除您需要=)