본문 바로가기
코리아 IT아카데미/node.js~~~

2022_0124 | 0119와 내용 중복

by Sharon kim 2022. 1. 26.

 

06-3.js

const express = require('express');
const app = express();
const port = 3000;

app.use((req, res) =>{
 console.log('첫번째 미들웨어 실행');

 console.dir(req.header)
 const userAgent = req.header('User-Agent');
 console.log(userAgent);

 // http://localhost:3000/?userid=apple
 const paramName = req.query.userid; // get방식의 변수값을 가져옴
 console.log(paramName);

 res.writeHead(200, {'content-type':'text/html;charset=utf8'});
 res.write('<h2>익스프레스 서버에서 응답한 메세지입니다.</h2>');
 res.write(`<p>User-Agent : ${userAgent}</p>`);
 res.write(`<p>paramName : ${paramName}</p>`);
 res.end();
});

app.listen(port, () => {
    console.log(`${port}포트로 서버 실행중..`)
});

06-4.js 

const express = require('express');
const bodyParser = require('body-parser');  // post 데이터를 전달받기 위해 사용

const app = express();
const port = 3000;

// body-parser를 이용해 application/x-www-form-urlencoded 파싱
app.use(bodyParser.urlencoded({extended:false}));

app.use((req, res) => {
    const userid = req.body.userid;//서버에 아이디 요청(post)
    const userpw = req.body.userpw;//서버에 비번 요청(post)
    
    console.log(`userid:${userid}, userpw:${userpw}`);

    res.writeHead(200, {'content-type':'text/html;charset=utf8'});
    res.write('<h2>익스프레스 서버에서 응답한 메세지입니다.</h2>');
    res.write(`<p>아이디 : ${userid}</p>`);
    res.write(`<p>비밀번호 : ${userpw}</p>`);
    res.end();
});


app.listen( port, () => {
    console.log(`${port} 포트로 서버 실행중...`);
})

포트 서버 실행하고 postman 에서 각각 send하면 console.log 내용 나옴

06-5.js

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const port = 3000;

const router = express.Router();

app.use(bodyParser.urlencoded({ extended: false}));


// http://localhost:3000/member/login -> post
router.route('/member/login').post((req, res) => {
    console.log('/member/login 호출!');
});

// http://localhost:3000/member/regist -> post
router.route('/member/regist').post((req, res) => {
    console.log('/member/regist 호출!');
});

// http://localhost:3000/member/about -> get
router.route('/member/about').get((req, res) => {
    console.log('/member/about 호출!');
});

app.use('/', router);
//에러가 발생했을때
app.all('*', (req, res) => {
    res.status(404).send('<h2>페이지를 찾을 수 없습니다.</h2>');
});

app.listen(port, () => {
    console.log(`${port} 포트로 서버 실행중...`);
})

파일 실행하고 postman post로 send하면 console.log('LOGGEED')

postman get

get 결과

07-1.js

const express = require('express');
const bodyParser = require('body-parser');

const app = express();
const port = 3000;

//미들웨어 사용법1
app.get('/',function(req,res){
    res.send(`hello World`);
});

const myLogger = function(){
    console.log('LOGGED');
}

app.use(myLogger);

app.listen(port, () => {
    console.log(`${port} 포트로 서버 실행중...`);
})

post

post

get

get

07-2.js

const express = require('express');

const app = express();
const port = 3000;

//미들웨어 사용법2
app.get('/',function(req,res,next){
    res.send(`hello World2`);
    next();//다음 미들웨어로 이동하는 
});

const myLogger = function(req, res, next){
    console.log('LOGGED');
    next();
}

app.use(myLogger);

app.listen(port, () => {
    console.log(`${port} 포트로 서버 실행중...`);
})

mail.js => 실패 0126 remail 참고

const express = require('express');
const bodyParser = require('body-parser');
const fs = require('fs');
const nodemailer = require('nodemailer'); //npm i nodemailer

const app = express();
const port = 3000;
const router = express.Router();

app.use(bodyParser.urlencoded({extended: false}));

// http://localhost:3000/mail
router.route('/mail').get((req, res) => {
    fs.readFile('mail.html', 'utf8', (err, data) => {
        if(!err){
            res.writeHead(200, {'content-type':'text/html'});
            res.end(data);
        }else{
            console.log(err);
        }
    });
});

router.route('/mailok').post((req, res) => {
    const from = req.body.from;
    const fromemail = req.body.fromemail;
    const to = req.body.to;
    const toemail = req.body.toemail;
    const title = req.body.title;
    const content = req.body.content;

    const fmtfrom = `${from}<${fromemail}>`;
    const fmtto = `${to}<${toemail}>`;

    const transporter = nodemailer.createTransport({
        service: 'Gmail',
        auth: {
            user: 'kimrkdud3240@gmail.com',
            pass: ' '
        },
        host: 'smtp.mail.com',
        port: '465'
    });

    const mailOptions = {
        from: fmtfrom,
        to: fmtto,
        subject: title,
        text: content
    };

    transporter.sendMail(mailOptions, (err, info) => {
        transporter.close();
        if(err){
            console.log(err);
        }else{
            console.log(info);
        }
    });
});

app.use('/', router);
app.all('*', (req, res) => {
    res.status(404).send('<h2>페이지를 찾을 수 없습니다.</h2>');
})

app.listen( port, () => {
    console.log(`${port}번 포트로 서버 실행중...`);
})

// 보안 수준이 낮은 앱의 액세스
// https://myaccount.google.com/lesssecureapps

// 계정 액세스 사용을 허용
// https://accounts.google.com/DisplayUnlockCaptcha

mail.html 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>노드메일 보내기</title>
</head>

<body>

    <h2>노드메일 보내기</h2>
    <form method="post" action="/mailok">
        <p><label>보내는 사람 : <input type="text" name="from"></label></p>
        <p><label>보내는 이메일 : <input type="text" name="fromemail"></label></p>
        <p><label>받는 사람 : <input type="text" name="to"></label></p>
        <p><label>받는 이메일 : <input type="text" name="toemail"></label></p>
        <p><label>제목 : <input type="text" name="title"></label></p>
        <p>내용</p>

        <p><textarea name="content" cols="60" rows="5"></textarea></p>
        <p><input type="submit" value="확인"></p>

    </form>

</body>

</html>

Nodemon
서버 코드를 변경할 때마다 서버를 재시작하도록 하는 모듈
npm install -g nodemon
-g: 글로벌 설치

"scripts": {
    "start": "nodemon 06-4.js"
  },

npm start 라고 실행하고 그다음부터는 저장하기만 해도 서버열지않고 업데이트됨


body-parser(post방식)
설치 npm i body-parser


node.js
const userid = req.query.userid;
http://localhost:3000/?userid=apple

query : 클라이언트에서 GET방식으로 전송한 요청 파라미터를 확인합니다.
body : 클라이언트에서 POST방식으로 전송한 요청 파라미터를 확인합니다.
(단, post방식을 통한 요청 파라미터를 확인하려면 body-parser와 같은 모듈을 사용해야합니다.)

const userid = req.body.userid;


포스트맨 다운로드
https://www.postman.com/downloads/


Router 미들웨어
사용자의 다양한 요청이 들어왔을때 use() 메소드로 설정한 미들웨어가 항상 호출되는 불편한점이 있습니다. 
이를 해결하고자 사용하는 미들웨어가 Router 미들웨어입니다.

Router 객체 만들기
const 라우터객체 = express.Router();

http://localhost:3000/member/login
라우터객체.route(요청패스).get(실행할 함수);
라우터객체.route(요청패스).post(실행할 함수);

익스프레스에 Router 객체 적용
app.use('/', 라우터객체);


Model View Controller

Model : 데이터베이스
View : 보이는 부분(html, 자바스크립트)
Controller : 로직,,,,연산결과 노드의 명령

EJS(Embedded Javascript) 모듈
EJS 모듈은 템플릿 엔진 모듈입니다.
템플릿 엔진 모듈은 특정한 파일로부터 HTML 페이지를 생성하는 모듈입니다.

설치 npm i ejs 

EJS 파일 형식의 특수 코드
<% ~~~ code ~~~~ %> : 자바스크립트 코드를 입력하는 영역입니다.
<%= 변수 또는 값 %> : 데이터를 출력합니다.
<%- 변수 또는 객체 %> : ejs 파일 전체를 전달합니다.

EJS 데이터를 전달
render() : 메소드의 매개변수에 전달하고자 하는 데이터를 입력하여 전달합니다.
ejs.render(data);


[PUG(구 jade)]
http://jade-lang.com/
https://www.npmjs.com/package/nunjucks

[Node.js에서 메일 보내기]
nodemailer모듈 설치
npm i nodemailer
gmail 서버를 이용하여 메일을 보낼 수 있다.

1. 메일 보내기 하기전에 설정해야하는 부분

2.     
const transporter객체명 = nodemailer.createTransport({
        service: 'Gmail',
        auth: {
            user: 'gmail 계정',
            pass: '비밀번호'
        },
        host: 'smtp.mail.com',
        port: '465'
    });

메일발송 옵션
const 메일발송 옵션 객체명 = {
  from : "이름<메일주소>",
  to:"이름<메일주소>"
  subject:"제목",
  text:"내용"
  (html: "HTML코드")
}

// 보안 수준이 낮은 앱의 액세스
// https://myaccount.google.com/lesssecureapps
// 계정 액세스 사용을 허용
// https://accounts.google.com/DisplayUnlockCaptcha