Web dev/Node.js

node 서버 만들기 nodemon 사용 / ReferenceError: require is not defined in ES module scope, you can use import instead

도잎 2023. 1. 13. 20:30
반응형

 

프론트에서 간단하게 api 테스트를 하기 위해 노드 서버를 사용했는데, 노드몬을 사용해 node 서버를 띄울 예정이었다. 먼저 노드 서버를 세팅할 폴더를 만들어준 후 그 안에서 서버를 세팅할 예정. 이렇게 하면 최종 api가 나오기 전에 미리 테스트를 해볼 수 있어 좋은 것 같다.

 

 

1. 폴더 만든 후 npm 셋팅

먼저 폴더를 만들어준 후, 해당 경로 안에서 npm init -y를 입력해주면 node_modules 폴더가 생성된다. 그 후, npm install을 실행하면 package.json 파일까지 생성된다.

$ mkdir nodeServer
$ cd nodeServer
$ npm init -y
$ npm install

 

node_modules와 package.json가 생성되었다면 express와 nodemon을 설치해준다.

$ npm i nodemon -D // nodemon 설치
$ npm i express // express 설치

 

 

2. server.js 파일 생성

두가지 모두 설치를 마치고 server.js 파일을 생성한 후 아래와 같이 입력해준다.

const express = require('express');
const app = express();
const port = 5000;

app.get('/', (req, res) => {
    res.send('Hello World');
});

app.listen(port, () => {
    console.log(`서버 실행 http://localhost:${port}`)
})

 

 

3. node server 실행

그 후 서버를 실행하기 전 package.json 스크립트를 수정해준다. 그 후, npm run dev 실행.

  "scripts": {
    "dev": "nodemon server.js"
  },
$ npm run dev

 

필요한 모듈을 설치하고 서버를 실행시켰더니 다음과 같이 에러가 났다. ReferenceError: require is not defined in ES module scope, you can use import instead

$ npm run dev

> nodeserver@1.0.0 dev
> nodemon server.js

[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node server.js`
file:///C:/Users/choij/OneDrive/%EB%B0%94%ED%83%95%ED%99%94~1-DESKTOP/nodeServer/server.js:4
const express = require('express')
                ^

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 'C:\Users\choij\OneDrive\바탕화~1-DESKTOP-6M8PH1V-3490306\nodeServer\package.json' contains "type": "module". To treat it as a CommonJS script, rename it to use the '.cjs' file extension.
    at file:///C:/Users/choij/OneDrive/%EB%B0%94%ED%83%95%ED%99%94~1-DESKTOP-6M8PH1V-3490306/nodeServer/server.api.js:4:17
    at ModuleJob.run (node:internal/modules/esm/module_job:193:25)
    at async Promise.all (index 0)
    at async ESMLoader.import (node:internal/modules/esm/loader:530:24)
    at async loadESM (node:internal/process/esm_loader:91:5)
    at async handleMainPromise (node:internal/modules/run_main:65:12)

Node.js v18.12.1
[nodemon] app crashed - waiting for file changes before starting...

 

해당 에러는 package.json에  "type": "module"이라고 설정되어있기 때문에 나는 에러였는데 모듈 단위로 import/export 하는 문법만 이해할 수 있도록 되어있다. 그래서 에러에서도 require 대신 import를 사용하라고 나와있었고 그래서 해당 부분을 해결하기 위해 "type": "module" -> "type": "commonjs"로 바꿔주니 해결되었다.

 

$ npm run dev

> nodeserver@1.0.0 dev
> nodemon server.js

[nodemon] 2.0.20
[nodemon] to restart at any time, enter `rs`
[nodemon] watching path(s): *.*
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node server.js`
서버 실행 http://localhost:5000

 

제대로 실행되고, 제대로 나온다~

 

 

 

4. json 파일 데이터 생성

서버가 제대로 실행되는 것을 확인했으니 필요한 json 데이터를 생성해 불러와보고자한다. 기존에 작업하던 폴더에 dataList.json 파일을 생성해준 후, json 데이터 몇개를 넣어줘봤다.

// dataList.json
[
  {
    "id": 1,
    "name": "Minsu",
    "age": 25
  },
  {
    "id": 2,
    "name": "Lia",
    "age": 22
  },
  {
    "id": 3,
    "name": "Lay",
    "age": 23
  }
]
// server.js 수정

const express = require('express');
const app = express();
const port = 5000;

// 해당 부분 추가
const fs = require('fs');
const dataBuffer = fs.readFileSync('dataList 파일 경로');
const dataJSON = dataBuffer.toString();
const dataList = JSON.parse(dataJSON);

// 해당부분 수정
app.get('/data/list', (req, res) => {
    res.send(dataList);
});

app.listen(port, () => {
    console.log(`서버 실행 http://localhost:${port}`)
})

 

수정이 끝나고 서버를 재시작한 후, localhost:5000/data/list 를 입력하니 내가 넣어 놓은 데이터가 잘 들어가있는 것을 확인할 수 있다.

 

 

이런식으로 node 서버를 간단하게 셋팅하여 테스트용으로 사용하면 좋을 것 같다. 필요한 데이터가 잘 요청되는지 등을 프론트에서 확인할 수 있도록 설정하니 요청에 따른 응답을 확인해볼 수 있었다.

반응형