Node.js/κ²Œμ‹œνŒ λ§Œλ“€κΈ°

κ²Œμ‹œνŒ κΈ€ μž‘μ„±ν•˜κΈ°

λŒ•λŒ•μ΄λ°œπŸΎ 2018. 11. 18. 17:37

κ²Œμ‹œνŒμ— 글을 μ“°λŠ” μž‘μ—…λ„ μ΄μ–΄μ„œ 진행해보도둝 ν•˜κ² μŠ΅λ‹ˆλ‹€. κ²Œμ‹œκΈ€μ„ μ“΄λ‹€λŠ” 것은 DB에 λ‚΄κ°€ μ“΄ κ²Œμ‹œκΈ€μ˜ λ‚΄μš©μ΄ μ €μž₯λœλ‹€λŠ” 뜻 이겠죠? 일단 κ°„λ‹¨ν•œ κΈ€ μ“°κΈ° νŽ˜μ΄μ§€ 폼을 μž‘μ„±ν•΄λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.



views/write.pug

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
link(rel='stylesheet', href='css/bootstrap.css')
link(rel='stylesheet', href='https://cdnjs.cloudflare.com/ajax/libs/bootstrap-select/1.12.4/css/bootstrap-select.min.css')
ons-page
    ons-toolbar
    div(style='text-align: center; margin-top:3%;')
        section(style='padding: 8px')
            textarea.text-input#subject(type='text', ng-model='text', placeholder='제λͺ©', style='width: 80%; height:30px;')
        section(style='padding: 0 8px 8px')
            textarea.textarea#content(ng-model='text2', placeholder='λ‚΄μš©', style='width: 80%; height: 400px;')
        section(style='padding: 0 8px 8px')
            button(type="button" class='btn btn-primary' onclick='submitFunction()') Submit
 
script.
    var subject = document.getElementById('subject');
    var content = document.getElementById('content');
    var url = 'http://localhost:3000/write_receive';
    function submitFunction() {
        var data = {'subject':subject.value, 'content':content.value};
        data = JSON.stringify(data);
        var xhr = new XMLHttpRequest();
        xhr.open('POST',url,true);
        xhr.setRequestHeader('Content-type','application/json');
        xhr.send(data);
        xhr.addEventListener('load',function(){
            var result = JSON.parse(xhr.responseText);
            if(result.result=='ok'){
                alert('μž‘μ„±μ™„λ£Œ')
                location.replace('http://localhost:3000/commuity')
            }
        })
    }
cs


이 λΆ€λΆ„μ—μ„œλŠ” νŽ˜μ΄μ§€λ₯Ό λ Œλ”λ§ν•˜λŠ” 것 뿐만 μ•„λ‹ˆλΌ client λ‹¨μ—μ„œ server μͺ½μœΌλ‘œ 데이터λ₯Ό λ³΄λ‚΄λŠ” POST 톡신이 ν•„μš”ν•˜κΈ° λ•Œλ¬Έμ—

post λΌμš°ν„°λ„ 같이 μž‘μ„±ν•΄μ£Όμ–΄μ•Ό ν•©λ‹ˆλ‹€.



routes/write.js

1
2
3
4
5
6
7
8
9
10
11
12
let express = require('express')
let router = express.Router()
let app = express();
let path = require('path')
app.set('views',path.join(__dirname,'views'));
app.set('view engine','pug')
 
router.get('/',function(req,res){
    res.render('write')
})
 
module.exports = router;
cs



routes/write_receive.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
let express = require('express')
let router = express.Router()
let app = express();
let path = require('path')
let board = require('../function/board')
let session = require('express-session')
app.set('views',path.join(__dirname,'views'));
app.set('view engine','pug')
app.use(session({
    secret:'123123123',
    resave:false,
    saveUninitialize:true
}));
 
router.post('/',function(req,res){
    board.boardWriteFunction(req.body.subject,req.body.content,req.session.idx,function(result){
        res.json(result)
    })    
})
 
module.exports = router;
cs


μ΄μ „κ³ΌλŠ” λ‹€λ₯΄κ²Œ POST 방식을 μž‘μ„±ν•©λ‹ˆλ‹€. 


app.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
const createError = require('http-errors');
const express = require('express');
const path = require('path');
const cookieParser = require('cookie-parser');
const bodyParser = require('body-parser');
const session = require('express-session')
const passport = require('passport')
const sequelize = require('sequelize')
const models = require('./models')
const app = express();
 
//app.get
const indexRouter = require('./routes/index');
const commuityRouter = require('./routes/commuity')
const writeRouter = require('./routes/write');
//app.post
const writeReceiveRouter = require('./routes/write_receive');
 
//sequelize
models.sequelize.sync()
    .then(function() {
    console.log('βœ“ DB connection success.');
      console.log('  Press CTRL-C to stop\n');
  })
  .catch(function(err) {
    console.error(err);
    console.log('βœ— DB connection error. Please make sure DB is running.');
    process.exit();
  });
 
// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine''pug');
 
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());
app.use(cookieParser())
app.use(session({
    secret:'123123123',
    resave:false,
    saveUninitialize:true
}));
app.use(express.static(__dirname));
 
//get
app.use('/', indexRouter);
app.use('/commuity',commuityRouter);
app.use('/write',writeRouter);
//post
app.use('/write_receive',writeReceiveRouter);
 
// catch 404 and forward to error handler
app.use(function(req, res, next) {
  next(createError(404));
});
 
// error handler
app.use(function(err, req, res, next) {
  // set locals, only providing error in development
  res.locals.message = err.message;
  res.locals.error = req.app.get('env'=== 'development' ? err : {};
 
  // render the error page
  res.status(err.status || 500);
  res.render('error');
});
module.exports = app;
 
cs


μ›¬λ§Œν•˜λ©΄ commuity νŽ˜μ΄μ§€μ— κΈ€μ“°κΈ° λ²„νŠΌμ„ λ§Œλ“€μ–΄μ„œ κΈ€μ“°κΈ° νŽ˜μ΄μ§€λ‘œ λ„˜μ–΄κ°€λ©΄ μ’‹κ² μ§€λ§Œ μ½”λ“œκ°€ μ’€ 많이 λ³€ν˜•λ˜μ–΄λ²„λ €μ„œ μ£Όμ†Œλ₯Ό 직접 νƒ€μ΄ν•‘ν•˜μ—¬ κΈ€μ“°κΈ° νŽ˜μ΄μ§€λ‘œ μ ‘κ·Όν•˜κ² μŠ΅λ‹ˆλ‹€.



일단 싀행을 ν•œ ν›„ localhost:3000/write 둜 μ ‘κ·Όν•˜λ©΄ 이런 νŽ˜μ΄μ§€κ°€ λ‚˜μ˜¬ κ²ƒμž…λ‹ˆλ‹€.


submit λ²„νŠΌμ„ λˆ„λ₯΄κ²Œ 되면 routes/write_receive.js 파일둜 κ°€κ²Œ λ©λ‹ˆλ‹€. ν•΄λ‹Ή ν…μŠ€νŠΈλ°•μŠ€μ— μž‘μ„±ν•œ λ‚΄μš©μ„ post λΌμš°ν„°μ— λ„˜κ²¨μ£Όκ²Œ λ©λ‹ˆλ‹€. 그럼 κ·Έ 데이터λ₯Ό κ°€μ§€κ³  DB 처리λ₯Ό ν•˜λŠ” ν•¨μˆ˜ boardWriteFunction 을 μž‘μ„±ν•΄μ€λ‹ˆλ‹€.

기쑴에 κ²Œμ‹œκΈ€μ„ λ‘œλ“œν•˜λŠ” ν•¨μˆ˜μ— μ΄μ–΄μ„œ μž‘μ„±ν•˜κ² μŠ΅λ‹ˆλ‹€.


function/board.js

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
let models = require('../models');
 
function boardWriteFunction(subject,content,fk_userId,callback){
    let responseData = {'result':'ok'}
    models.Board.create({
        subject:subject,
        content:content,
        fk_userId: fk_userId,
    }).then(function(result){
        callback(responseData)
    }).catch(function(err){
        console.log(err)
    })
}
 
exports.boardWriteFunction = boardWriteFunction;
cs


제λͺ©κ³Ό λ‚΄μš©μ„ DB에 μ €μž₯ν•΄μ€€ 후에 ν•΄λ‹Ή ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν–ˆλ˜ router에 responseDataλ₯Ό λ„˜κ²¨μ€λ‹ˆλ‹€. Ajaxλ₯Ό μ‚¬μš©ν•˜μ˜€κΈ° λ•Œλ¬Έμ— 데이터 μ²˜λ¦¬κ°€ λ¬΄μ‚¬νžˆ λ˜μ—ˆλ‹€λŠ” 사인을 보낸닀고 μƒκ°ν•˜μ‹œλ©΄ λ©λ‹ˆλ‹€.



λ¬΄μ‚¬νžˆ 전솑이 됐닀면 μ΄λ ‡κ²Œ alert 창이 뜨게 되고 commuity νŽ˜μ΄μ§€λ₯Ό λ‘œλ“œν•΄μ£Όλ©΄ ν•΄λ‹Ή λ‚΄μš©μ΄ μΆ”κ°€λ©λ‹ˆλ‹€.