개발/Javascript(Typescript)

[postgresql] express 서버에서 데이터 insert 하기

piece5 2023. 8. 30. 22:56

출처

https://dev.to/shreshthgoyal/user-authorization-in-nodejs-using-postgresql-4gl


1. postgresql 데이터베이스 접속

db.js

const {Pool} = require("pg");
require("dotenv").config();

const dbConfig = {
  user: process.env.PG_USER,
  password: process.env.PG_PASSWORD,
  host: process.env.PG_HOST,
  port: process.env.PG_PORT,
  database: process.env.PG_DATABASE,
};

const client = new Pool(dbConfig);
client.connect();

module.exports = client;

 

2. 라우터 만들기

axios body를 가져오기 위하여 body-parser 모듈이 필요함.

...
const bodyParser = require("body-parser");
const userRouter = require('./routes/user');
...
app.use(bodyParser.json())
...
app.use('/user', userRouter)
...

데이터베이스 접속이 필요한 곳 (user.js)에 db.js 가져오기

const express = require("express");
const router = express.Router();
const client = require("../db");

router.post("/register", async (req, res, next) => {
    console.log(req.body);
    const {user_name, user_password} = req.body;
    ...
});

module.exports = router;

 

3. user_account 테이블에 아이디 비밀번호 insert 하기 

bcrypt : 비밀번호 해싱

jsonwebtoken : 웹토큰

 

아이디(user_name)가 이미 사용되고 있는 아이디인지 확인하고 맞으면 409 에러 메세지를 반환한다.

새로운 아이디가 맞다면 비밀번호를 해싱하고 user_account에 insert 한다.

...
const bcrypt = require("bcrypt");
const jwtGenerator = require("jsonwebtoken");

router.post("/register", async (req, res, next) => {
    console.log(req.body);
    const {user_name, user_password} = req.body;
    try {
            const confirmUser = await client.query(`SELECT * FROM user_account WHERE user_name=$1`, [user_name,]);
            if (confirmUser.rows.length !== 0) {
                return res.status(409).json({
                    error: "Sorry! An account with that ID already exists!",
                });
                
            } else {
                bcrypt.hash(user_password, 10, async (err, hashedPassword) => {
                    if (err) {
                        return res.status(500).json({
                            error: err.message,
                        });
                    } else {
                        const userQuery = `INSERT INTO user_account(user_name, password_hash) VALUES($1, $2) RETURNING user_id`;
                        const user_no = await client.query(userQuery, [user_name,hashedPassword]);

                        const token = jwtGenerator(user_id);

                        res.status(200).json({
                            message: `Account created successfully!`,
                            token,
                        });
                    }
                })
            }
    } catch (err) {
        console.error(err);
    }
});

module.exports = router;