TIL 홈페이지 만들기 5

TIL 홈페이지 만들기 5

src 디렉토리 안에 routes 디렉토리를 만들고 그 안에 user.ts, middlewares.ts 파일을 만든다.
src 디렉토리 안에 passport 디렉토리를 만들고 그 안에 index.ts, local.ts 파일을 만들고 아래와 같이 입력한다.

index.ts

import passport from "passport";
import {getRepository} from "typeorm";
import { User } from "../entity/User";
import local from "./local";

export default () => {
	passport.serializeUser((user: any, done) => {
		done(null, user.id);
	})

	passport.deserializeUser(async (id, done) => {
		try {
			const user = await getRepository(User).findOne(id);
			// const user = await User.findOne({ where: { id } })
			done(null, user)
		} catch (e) {
			console.error(e);
			done(e);
		}
	});

	local();
}

local.ts

import passport from "passport";
import { Strategy as LocalStrategy } from "passport-local";
import {getRepository} from "typeorm";
import {User} from "../entity/User";
import bcrypt from "bcrypt";

export default () => {
	passport.use(new LocalStrategy({
		usernameField: 'email',
		passwordField: 'password'

	}, async (email, password, done) => {
		try {
			const user = await getRepository(User).findOne({
				where: { email }
			});
			if (!user) {
				return done(null, false, { reason: '존재하지 않는 이메일입니다!' })
			}
			const res = await bcrypt.compare(password, user.password)
			if (res) {
				return done(null, user);
			}
			return done(null, false, { reason: '비밀번호가 틀렸습니다!' })
		} catch (e) {
			console.error(e)
			return done(e)
		}

	}));
}

위처럼 수정을 완료 했으면 src/index.ts를 아래와 같이 수정해 준다.

...
// Import Routers
import userRouter  from './routes/user';
import passportConfig from './passport';

dotenv.config();
const app = express();
createConnection()
	.then(() => {
		console.log('db 연결 성공!!');
	})
	.catch((error) => console.log(error));

passportConfig();
...

...
app.get('/', (req: express.Request, res: express.Response) => {
	res.send('Hello World!');
});

app.use(userRouter);

app.listen(4000, () => {
	console.log('Example app listening on port 4000!');
});
...

src 디렉토리 안에 controllers 디렉토리를 만들고 그 안에 user.controller.ts 파일을 만들고 아래와 같이 입력한다.

import { Request, Response, NextFunction } from "express";
import { getRepository } from "typeorm";
import { User } from "../entity/User";
import passport from "passport";

export const getUser = async (req: any, res: Response, next: NextFunction): Promise<Response> => {
	try {
		console.log(req.user);
		if (req.user) {
			const id = req.user.id
			const userRepository = getRepository(User);
			const user = await userRepository.findOneOrFail(id, {
				select: ["id", "email"], //We dont want to send the password on response
			});
			// const data = user.toJSON();
			return res.status(200).json(user)
		} else {
			res.status(200).json(null)
		}
	} catch (e) {
		console.error(e);
		next(e);
	}
	// const results = await getRepository(User).findOne(req.params.id);
	// return res.json(results);
};

export const createUser = async (req: Request, res: Response, next: NextFunction): Promise<Response> => {

	const user = await getRepository(User).findOne({ email: req.body.email});

	if (user) {
		// return res.status(401).send('이미 가입된 사용자 입니다.');
		return res.status(200).json({isError: true, message: '이미 사용중인 이메일입니다.'})
	} else {
		const newUser = await getRepository(User).create({
			email: req.body.email,
			password: req.body.password,
		});

		await getRepository(User).save(newUser);
		return res.status(200).json(true)
	}
};

export const loginUser = async (req: any, res: Response, next: NextFunction): Promise<void> => {
	passport.authenticate('local', (err, user, info) => {
		if (err) {
			console.error(err);
			return next(err);
		}
		if (info) {
			console.log(info)
			return res.status(200).json({isError: true, message: info.reason})
			// return res.status(401).send(info.reason);
		}
		return req.login(user, async (loginErr) => {
			if (loginErr) {
				// console.error(loginErr)
				return next(loginErr);
			}
			const id = req.user.id
			const userRepository = getRepository(User);
			const user = await userRepository.findOneOrFail(id, {
				select: ["id", "email"], //We dont want to send the password on response
				// relations: ["posts"]
			});
			// console.log(user)
			return res.status(200).json(user)
		})
	})(req, res, next)
}

그 다음 routes/user.ts 파일을 아래와 같이 수정한다.

import express from 'express';
import {isLoggedIn, isNotLoggedIn} from "./middlewares";

const router = express.Router();

import {getUser, createUser, loginUser, logoutUser} from "../controllers/user.controller";

router.get("/user", getUser);
router.post("/user", createUser);
router.post("/user/login", [isNotLoggedIn], loginUser);
router.post("/user/logout", [isLoggedIn], logoutUser)

export default router;

서버를 킨 다음에 postman 으로
http://localhost:4000/user

{
    "email":"[email protected]",
    "password":"1234567aaa"
}

post 으로 날리면 디비에 유저가 새로 생긴 것을 확인 할 수 있다.

좋은 웹페이지 즐겨찾기