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 으로 날리면 디비에 유저가 새로 생긴 것을 확인 할 수 있다.
Author And Source
이 문제에 관하여(TIL 홈페이지 만들기 5), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@adffewr/TIL-홈페이지-만들기-5저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)