mysql 연결

유석현(SeokHyun Yu)·2022년 12월 11일
0

Node.js

목록 보기
22/29
post-thumbnail

database.js

import mysql from "mysql2";

// pool 생성
// getConnection으로 연결하는 것보다 전에 있던 pool을 이용해서 연결하기 때문에 연걸 속도가 더 빠르다
const pool = mysql.createPool({
  host: "127.0.0.1",
  user: "root",
  database: "twitter",
  password: "0000",
});

const db = pool.promise();

export default db;

app.js

import express from "express";
import helmet from "helmet";
import morgan from "morgan";
import cors from "cors";
import tweetController from "./tweet/tweet.controller.js";
import authController from "./auth/auth.controller.js";
import { config } from "../config.js";
import db from "../database.js";

// 서버 생성
const app = express();

// 미들웨어
app.use(express.json());
app.use(morgan("dev"));
app.use(helmet());
app.use(cors());

// 라우터
app.use("/tweet", tweetController);
app.use("/auth", authController);

// 404 에러 핸들러
app.use((req, res, next) => {
  res.sendStatus(404);
});

// 500 에러 핸들러
app.use((err, req, res, next) => {
  res.sendStatus(500);
});

// 데이터베이스 연결
db.getConnection();

// 8000 포트로 listen
app.listen(config.port, () => {
  console.log("Server On...");
});

user.repository.js

import db from "../../database.js";

export const findByUsername = async (username) => {
  return db
    .execute("SELECT * FROM user WHERE username=?", [username])
    .then((data) => data[0][0]);
};

export const findById = async (id) => {
  return db
    .execute("SELECT * FROM user WHERE id=?", [id])
    .then((data) => data[0][0]);
};

export const createUser = async (user) => {
  const { username, password, name, email } = user;

  return db
    .execute(
      `INSERT INTO user(username, password, name, email) VALUES(?, ?, ?, ?)`,
      [username, password, name, email]
    )
    .then((data) => {
      return data[0].insertId;
    });
};

auth.service.js

import * as userRepository from "../user/user.repository.js";
import bcrypt from "bcrypt";
import jwt from "jsonwebtoken";
import { config } from "../../config.js";

const createToken = (id) => {
  return jwt.sign({ id }, config.jwtSecretKey, {
    expiresIn: config.jwtExpires,
  });
};

// 회원가입
export const signup = async (req, res) => {
  const { username, password, name, email } = req.body;

  // 이미 가입된 유저일 경우
  const user = await userRepository.findByUsername(username);

  if (user) {
    return res.status(409).json({ message: `이미 가입된 유저입니다.` });
  }

  // 비밀번호 암호화
  const hashed = await bcrypt.hash(password, config.bcryptSaltRounds);

  // 유저 데이터 생성
  const createdUserId = await userRepository.createUser({
    username,
    password: hashed,
    name,
    email,
  });

  // 토큰 생성
  const token = createToken(createdUserId);

  res.status(201).json({ token, username });
};

// 로그인
export const login = async (req, res) => {
  const { username, password } = req.body;

  // username을 가진 유저가 있는지 확인
  const user = await userRepository.findByUsername(username);

  if (!user) {
    return res
      .status(401)
      .json({ message: "아이디 혹은 비밀번호가 틀렸습니다." });
  }

  // bcrypt.compare()로 암호화 된 비밀번호와 비교
  const isValidPassword = await bcrypt.compare(password, user.password);

  if (!isValidPassword) {
    return res
      .status(401)
      .json({ message: "아이디 혹은 비밀번호가 틀렸습니다." });
  }

  // 토큰 생성
  const token = createToken(user.id);

  res.status(200).json({ token, username });
};

// me
export const me = async (req, res) => {
  const user = await userRepository.findById(req.userId);

  if (user) {
    return res.status(200).json({ token: req.token, username: user.username });
  }

  res.status(404).json({ message: "유저가 존재하지 않습니다." });
};

user 데이터베이스


회원가입


회원가입 (409)

profile
Backend Engineer

0개의 댓글