[Node.js] ERR_MODULE_NOT_FOUND: Cannt find module file

Kim Yuhyeon·2024년 3월 20일

문제 상황

import mongoose from "mongoose";
import { connectDB, disconnectDB } from "../utils/database";

위와 같은 폴더 구조에서 경로가 틀리지 않았는데도 아래 오류가 지속해서 떴다.

    throw new ERR_MODULE_NOT_FOUND(
          ^

Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/Users/yuhyeon/Desktop/13month/crawler/src/utils/database' imported from /Users/yuhyeon/Desktop/13month/crawler/src/models/fund.js
    at finalizeResolution (node:internal/modules/esm/resolve:263:11)
    at moduleResolve (node:internal/modules/esm/resolve:908:10)
    at defaultResolve (node:internal/modules/esm/resolve:1131:11)
    at ModuleLoader.defaultResolve (node:internal/modules/esm/loader:390:12)
    at ModuleLoader.resolve (node:internal/modules/esm/loader:359:25)
    at ModuleLoader.getModuleJob (node:internal/modules/esm/loader:234:38)
    at ModuleWrap.<anonymous> (node:internal/modules/esm/module_job:85:39)
    at link (node:internal/modules/esm/module_job:84:36) {
  code: 'ERR_MODULE_NOT_FOUND',
  url: 'file:///Users/yuhyeon/Desktop/13month/crawler/src/utils/database'
}

해결 방법

package.json에
"type": "module", 이 있어
import 시 .js를 붙여주니 해결되었다

import mongoose from "mongoose";
import { connectDB, disconnectDB } from "../utils/database.js";

원인

JavaScript에서 모듈을 import할 때, 모듈 시스템은 확장자를 제외하고 모듈의 경로를 찾으려고 시도한다.
ex. import { connectDB } from "../utils/database";코드에서 모듈 시스템은 "../utils/database" 경로에 해당하는 모듈을 찾아 .js 확장자를 자동으로 추가하려고 시도한다.

일반적으로 Node.js는 CommonJS 모듈 시스템을 사용하며, 확장자를 생략할 때 .js, .json, .node 파일을 찾는다.

그러나 최신 버전의 Node.js(ESM - ECMAScript Modules)에서는 확장자를 생략하면 기본적으로 .js 파일만 찾는다.
따라서 .json 파일이나 .node 파일을 import하려면 명시적으로 확장자를 포함해야 한다.

따라서 "type": "module" 옵션이 package.json 파일에 추가되면, JavaScript 모듈 시스템이 확장자를 생략하지 않고도 모듈을 찾으려고 시도한다.

이 때문에 import 문에서 .js 확장자를 명시적으로 포함해야 한다. 따라서 import { connectDB, disconnectDB } from "../utils/database.js"; 코드를 사용하여 모듈을 정확히 찾을 수 있다!

참고

https://stackoverflow.com/questions/65384754/error-err-module-not-found-cannot-find-module

0개의 댓글