その他

【Express.js + mongoDB】DBへの初期データの投入(Seeder)

その他
この記事は約5分で読めます。

初期データの作成

/_data/users.json

[
  {
    "_id": "5d7a514b5d2c12c7449be042",
    "email": "hoge@hoge.com",
    "password": "hogehohge"
  },
  ...
]

seederの作成

node seeder.jsで動くようにします。

DB接続

seeder.js

mongoose.connect(process.env.MONGO_URI, {
  useNewUrlParser: true,
  useCreateIndex: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
});

初期データファイルの読込

seeder.js

/**
 * Read JSON File
 */
const projects = JSON.parse(fs.readFileSync(`${__dirname}/_data/projects.json`, "utf-8"));
const users = JSON.parse(fs.readFileSync(`${__dirname}/_data/users.json`, "utf-8"));

データの書込/削除

seeder.js

/**
 * Import into DB
 */
const importData = async () => {
  try {
    await Project.create(projects);
    await User.create(users);
    process.exit();
  } catch (err) {
    console.error(err);
  }
};

/**
 * Delete Data
 */
const deleteData = async () => {
  try {
    await Project.deleteMany();
    await User.deleteMany();
    process.exit();
  } catch (err) {
    console.error(err);
  }
};

コマンド引数で処理を指定する

  • node seeder.js -i: 初期データ書込
  • node seeder.js -d: DBデータ全削除

seeder.js

/**
 * コマンド引数で処理を指定する
 * seeder.js -i -> importData
 * seeder.js -d -> deleteData
 */
if (process.argv[2] === "-i") {
  importData();
} else if (process.argv[2] === "-d") {
  deleteData();
}

ファイル全体

seeder.js

import fs from "fs";
import mongoose from "mongoose";
import Project from "./src/models/projects";
import User from "./src/models/users";

import dotenv from "dotenv";
dotenv.config({ path: "./config/config.env" });

mongoose.connect(process.env.MONGO_URI as string, {
  useNewUrlParser: true,
  useCreateIndex: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
});

/**
 * Read JSON File
 */
const projects = JSON.parse(fs.readFileSync(`${__dirname}/_data/projects.json`, "utf-8"));
const users = JSON.parse(fs.readFileSync(`${__dirname}/_data/users.json`, "utf-8"));

/**
 * Import into DB
 */
const importData = async () => {
  try {
    await Project.create(projects);
    await User.create(users);
    console.log("<)))><...Data imported...");
    process.exit();
  } catch (err) {
    console.error(err);
  }
};

/**
 * Delete Data
 */
const deleteData = async () => {
  try {
    await Project.deleteMany();
    await User.deleteMany();
    console.log("<)))><...Data Deleted...");
    process.exit();
  } catch (err) {
    console.error(err);
  }
};

/**
 * コマンド引数で処理を指定する
 * seeder.js -i -> importData
 * seeder.js -d -> deleteData
 */
if (process.argv[2] === "-i") {
  importData();
} else if (process.argv[2] === "-d") {
  deleteData();
}

npm scriptでの引数指定

ちなみに、npm runyarnのスクリプトにコマンド引数を与える場合は、-(ハイフン)を連続させます。

package.json

"scripts": {
    "seed": "ts-node seeder.ts"
}
# データのインポート
$ npm run seed -- -i

# DBデータの全削除
$ npm run seed -- -d