Sequelize - πŸ˜“ index.js β†’ module νƒ€μž…μœΌλ‘œ μˆ˜μ •ν•˜κΈ°

import μ‚¬μš©μ„ μœ„ν•œ index.js μˆ˜μ •ν•˜κΈ°

require λŒ€μ‹ μ— import 문을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ package.jsonμ—μ„œ type module 섀정을 ν–ˆλ”λ‹ˆβ€¦
sequelize - index.jsμ—μ„œ μ•„λž˜μ˜ κ΅¬λ¬Έμ—μ„œ λ¬Έμ œκ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

//...
fs.readdirSync(__dirname)
  .filter((file) => {
    console.log(file);
    return (
      file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js"
    );
  })
  .forEach((file) => {
    // πŸ“Œ λ°”λ‘œ μ—¬κΈ° require()λΆ€λΆ„!!!!!
    const model = require(path.join(__dirname, file));
    console.log(file, model.name);
    db[model.name] = model;
    model.initiate(sequelize);
  });

μ•„λž˜μ™€ 같이 require λΆ€λΆ„μ—μ„œ 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

ReferenceError: require is not defined in ES module scope, you can use import instead
This file is being treated as an ES module because it has a '.js' file extension and '/Users/midas/Desktop/Projects/node-js/malcopolo/package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.

ES Module μ—μ„œλŠ” requireλ₯Ό μ‚¬μš©ν•  수 μ—†λŠ” 뢀뢄이죠. πŸ€”
ν•˜μ§€λ§Œ models ν΄λ”μ—μ„œ entity 객체λ₯Ό μ΄ˆκΈ°ν™” ν•΄μ£ΌκΈ° μœ„ν•΄μ„œλŠ” ν•„μš”ν•œ κ΅¬λ¬Έμ΄μ—ˆμŠ΅λ‹ˆλ‹€.
λ‹€ν–‰νžˆ λŒ€μ²΄ κ°€λŠ₯ν•œ μ½”λ“œλ₯Ό 잘 μž‘μ„±ν•œ μ‚¬μ΄νŠΈλ₯Ό 찾을 수 μžˆμ–΄μ„œ μ•„λž˜μ™€ 같이 μž‘μ„±ν–ˆμŠ΅λ‹ˆλ‹€.

// models/index.js

import Sequelize from "sequelize";
import fs from "fs";
import path from "path";
import { fileURLToPath } from "url";
import Config from "../config/config.json" assert { type: "json" };

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);

const env = process.env.NODE_ENV || "development";
const config = Config[env];
const db = {};

const sequelize = new Sequelize(
  config.database,
  config.username,
  config.password,
  config
);

export default async () => {
  const files = fs.readdirSync(__dirname).filter((file) => {
    return (
      file.indexOf(".") !== 0 &&
      file !== path.basename(__filename) &&
      file.slice(-3) === ".js"
    );
  });

  for await (const file of files) {
    // πŸ“Œ 이 뢀뢄이 import둜 ν•΄λ‹Ή 파일의 객체λ₯Ό μƒμ„±ν•˜λŠ” λΆ€λΆ„!
    const model = await import(`./${file}`);
    model.default.initiate(sequelize);
  }

  Object.keys(db).forEach((modelName) => {
    if (db[modelName].associate) {
      db[modelName].associate(db);
    }
  });

  db.sequelize = sequelize;

  return db;
};

model.default.initiate(sequelize);

model.defaultλ₯Ό μ‚¬μš©ν•œ μ΄μœ λŠ” ν•΄λ‹Ή import 문으둜 λ°›μ•„μ˜¨ model을 둜그둜 좜λ ₯ 해보면…
μ•„λž˜μ™€ 같이 default μ•ˆμ— 값이 λ“€μ–΄μžˆκΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.

[Module: null prototype] { default: User }

πŸ₯Έ 그리고!! μ‚¬μš©ν•˜λŠ” 뢀뢄도 export 뢀뢄이 ν•¨μˆ˜λ‘œ 내보내기 λ•Œλ¬Έμ—, μ•„λž˜μ™€ 같이 μ‚¬μš©ν•  수 μžˆμ—ˆμŠ΅λ‹ˆλ‹€.

// app.js
import db from "./models/index.js";

// πŸ“Œ 이 λΆ€λΆ„!
const database = await db();
const sequelize = database.sequelize;

sequelize
  .sync({ force: false })
  .then(() => {
    console.log("λ°μ΄ν„°λ² μ΄μŠ€ μ—°κ²° 성곡");
  })
  .catch((err) => {
    console.error(err);
  });

πŸ•Ί 고둜 데이터 베이슀 μ—°κ²° 성곡!

image

πŸ”– μ°Έκ³  μ‚¬μ΄νŠΈ


Β© 2021. All rights reserved.

Powered by Hydejack v9.1.6