console.log("email","password");//값을 찍어내는 게 아님, 들어오고 있는지 확인하려고/ 우리가 확인 한거 // 'password'는 텍스트, 아래에 있는 password는 변수
// //existingUser 는 객체로 key:value로 나오고, 그 안에 배열이 들어감, existingUser[0]={id: 5, email: 'y123@email.com', password: '123456789@2' } existingUser.id = 5 (dot notation) //
// 2-2 -> 지금 친 password 출력 // 지금 친 거는 request body에 들어있음
console.log(password);//console.log(req.body.password); -> const password = req.body.password 인데, const로 이미 passoword 안에 들어있으니까, password만 쳐도 됨/ 이제 찍자. 찍는 건 console.log로
//2-1 -> 위에서 select한 유저의 password 출력 (왜 select? 데이터베이스- mysql)
//위에서 select 유저의 이메일 가져오기
/*
const existingUser = await myDataSource.query(`
SELECT id, email FROM users WHERE email='${email}';
`) // password 기준으로 사람 찾아오면 안됨. email로 찾아야 함. // existingUSer 변수 중복으로 1번에 같이 넣어둠/ 근데 1번에서 이메일만 가져오는거니, 1번에서 패스워드, id도 가져오게 아예 코드 넣기
*/
// (sql문은 백엔드까지만 보내고, DB에는 안 보냄, 프>백>DB)\
// 2-2 -> 지금 친 패스워드와 데이터베이스에 있는 패스워드가 같은가
if (password!==existingUser[0].password) {
// if (req.body.password === userData.password) {
//지금 친 패스워드 = 변수 password --> 이거 맞는지 확인
consterror=newError("INVALID_PASSWORD");
error.statusCode=400;
throwerror;
}
// if 절을 'const inValidPassowrd = password !== existingUser[0].password; throwError(wrongPassword, 400, "AUTHENTICATION_FAILED");
//토큰 generate token / return 전에 token 만들기
// 1. use library allowing generating token
// 2. {"id": 10}
consttoken=jwt.sign({id:existingUser[0].id},"rekey");/// mysql을 데이터베이스라고 부르고, 회원가입을 했으면, 데이터베이스에 회원정보가 잘 들어갔는지 mysql 가서 확인 (mysql을 데이터베이스로 부른다)
// 3. signature /// mysql 가서 접속, 데이터베이스 불러오기 (show databases;)/ 여기 안에 westagram 데이터베이스 사용할거야 use westagram; / westagram 안에 회원가입이니까 users 테이블을 다 보여줘 select * from users;/그러면 여기 아래에 추가된 사용자 이름, 비번, 아이디 뜨면 성공
returnres.status(200).json({
message:"LOGIN_SUCCESS",
accessToken:token,//respond 보낼 때, 로그인 메세지와 함께 token 발행 (준다)
});
}catch (error) {
console.log(error);
}
});//existingUser 는 객체로 key:value로 나오고, 그 안에 배열이 들어감, existingUser[0]={id: 5, email: 'y123@email.com', password: '123456789@2' } existingUser.id = 5 (dot notation) //
// 과제 3 DELETE
// 가장 마지막 user를 삭제하는 엔드포인트
app.delete("/users",async(req,res)=>{
try{
//query문
}catch (err) {
console.log(err);
}
});
// 과제 4 UPDATE
// 1번 user의 이름을 'Code Kim'으로 바꾸어 보세요.
app.put("/users/1",async(req,res)=>{
try{
constnewName=req.body.data.name;
}catch (err) {
console.log(err);
}
});
// express app 으로 서버를 만듭니다.
constserver=http.createServer(app);
// 서버를 시작하는 함수
conststart=async()=>{
try{
server.listen(8000,()=>console.log(`Server is listening on 8000`));
}catch (err) {
console.error(err);
}
};
myDataSource.initialize().then(()=>{
console.log("Data Source has been initialized!");
});
start();
// 프론트에게 받아오려면 '/user' 바꾸고, localhost는 나 자신이니까, 내 ip 주소를 넣어서 들어가면 url 됨 / 프론트에겐, 내가 ip 주소와 port 번호 주면, 프론트에게 회원가입 창 뜸
// ip 주소는 터미널에 'ipconfig getifaddr en0' 치면 나옴 =10.58.52.90
// 저장은 comman+s , 서버 끄는 건 ctrl+c (안 쳐진다면 termninal에 넣어야), 항상 서버 키기 (node app3.js)
중복 if () 에 들어가는 것은
내가 해본 것인데
맞는지 확인 후 다시 업데이트 해야 한다.
회원가입 코드 다시 간단하게 해보면
app.post("/users",async(req,res)=>{
try{
constme=req.body;
console.log(me);
const{password,email, nickname}=me;
// 예외처리 email, password가 다 입력되지 않은 경우
if(email===undefined||password===undefined){
consterror=newError("KEY_ERROR");
error.statusCode=400;
throwerror;
}
// 예외처리 이메일이 중복되어 이미 가입한 경우
constexistingUser=awaitmyDataSource.query(`
SELECT id, email FROM users WHERE email='${email}';
- DataSource는typeorm만든typeorm개발자들이, 데이베이스 연결 쉽게 하라고 미리 만들어놓은 객체
- 우리는 이걸 사용
type: 'mysql'
host: '내 서버니까localhost'
port:mysql 데이터베이스도 서버이기에,
우리가 서버 열 때 사용했던 8000 같이,
데이터베이스 서버 포트는 보통'3306'씀
username: 'root'
password: 'mysql password'
databaes: '연결할 database name'
typeorm이 실제로 mysql에 로그인해서 가져오는거기 때문에.
그러기에, database , username, password 잘못 쓰면
없다고 터미널에 뜸
2. app.get
뜯어서 보자
2-1) 첫번째 app.get
백엔드가 프론트에게 회원 정보를 가져온다는게 아님.
여기는 프론트엔드가 나중에 백엔드에게 정보를 get한다는것
// 여기에서는 서버 작동이지, 무언가를 받아오는게 아님.
2-2) 두 번째 app.get
/users 사이트에서
req로 받아온 req.body에 담긴
회원가입하려고 고객이 적은 email, password 정보를 --> select id name email FROM USERS 테이블 --> mysql 테이블
프론트엔드가 백엔드에게 받아온다.
(비단 회원가입할떄 뿐만 아니라, 나중을 위해
로그인 등 할 떄 필요하겠지?)
프론트가 백엔드 서버에서 정보를 받아서 화면에 보여주는 부분도,
쿼리문으로 코드 칠 것
(mysql 데이터베이스에서 정보를 가져와서)
const userData= await myDataSource.query("SELECT id, name, email From USERS");
코드에서 찍어내보는 방법 console. log 쓰는데,
이 부분에서 constuserData= await myDataSource.query("SELECT id, name, email From USERS"); 가 잘 갔나 확인 할 거면, 1) console.log ("User Data: ", userDate) 를 vscode javascript에 치고, - 확인하기 쉽게 string으로 User Data: 한 것 2) postman - get - http://localhost:8000/users - app.get("/users", ) 이니까 3) postman send 돌리고, terminal 에서 확인하면,
결과 나왔으니, mysql 데이터베이스에서, 백엔드 서버로는 잘 넘어왔다.
app.post에서
1) 프론트가 백엔드에게 정보 준다 (백엔드는프론트에게 정보 받는다) -- 백엔드 서버
constme=req.body;
console.log( "Me: ",me);
--> 정보가 잘 가는지 확인하는 과정
postman - post - http://localhost:8000/users(아직 완성 안했지만 에러 나는건 당연하고, 일단 잘 찍히는지 console.log로 확인)
2) 백엔드 서버에 있는 정보를데이터베이스에 저장해야 함! -- 데이터베이스 서버
const name = me.name
const password = me.password
const email = me.email
ME 안의 name을 불러와서, const name이라는 변수를 생성해서 ME라는 객체에 접근해서 name을 가져온 것
근데 팁!
const password = me.password
const email = me.email
= const { password, email } = me;
다시 돌아와서,
constuserData=awaitmyDataSource.query(`
INSERT INTO users (name,password,email)VALUES ('yj','${password}','${email}')`