Node.js | Node.js/Express으로 PostgreSQL 사용 | 레코드 추가


다음은 레코드를 추가 할 과정이다. 이것은 routes내 준비하는 add.js에서의 폼 표시를 create.js에서 양식 제출 후 처리(즉, 양식의 내용에서 레코드를 저장하는 처리)를 구현한다. 또한, views 폴더에 양식을 표시하는 add.ejs 템플릿 파일을 준비할 필요하다.

아래 목록란에 3개의 파일의 내용을 정리해 게재하고 있다.

add.ejs

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1><%= title %></h1>
    <p><%= msg %></p>
    <form method="post" action="/create">
    <table>
        <tr><td>NAME:</td><td><input type="text" name="name"></td></tr>
        <tr><td>MAIL:</td><td><input type="text" name="mail"></td></tr>
        <tr><td>MEMO:</td><td><input type="text" name="memo"></td></tr>
        <tr><td></td><td><input type="submit"></tr>
    </table>
    </form>
  </body>
</html>

add.js

var express = require('express');
var router = express.Router();
 
/* add page. */
router.get('/', function(request, response, next) {
    response.render('add', 
        {
            title: 'Add Page',
            msg: 'please type data:'
        }
    );
});
 
module.exports = router;

create.js

var express = require('express');
var router = express.Router();
var pg = require('pg');
 
/* add page. */
router.post('/', function(request, response, next) {
    var name_str = request.body["name"];
    var mail_str = request.body["mail"];
    var memo_str = request.body["memo"];
      
    var con = "tcp://postgres:admin@localhost:5432/postgres";
    pg.connect(con, function(err, client) {
        var qstr = "insert into mydata (name,mail,memo) values($1, $2, $3);";
        var query = client.query(qstr,[name_str, mail_str, memo_str]);
        query.on('end', function(row,err) {
            response.redirect("/");
        });
        query.on('error', function(error) {
            console.log("ERROR!");
            response.render('index', {
                title: "ERROR",
                data: null,
                message: "ERROR is occured!"
            });
        });
    });
});
 
module.exports = router;

폼을 작성하여 제출하면 그것이 레코드로 테이블에 추가된다. 작성 후에 index로 리디렉션되므로 표시된 레코드를 확인할 수 있다.

● POST 처리

router.post (...중략...);

이번, create.js에는 처리를 추가하는데 router.get 대신 “router.post"를 사용하고 있다. POST된 처리는 이 post 함수를 이용하여 처리를 설정해야 한다.

수신된 폼에서 정보 얻기

var name_str = request.body["name"];
var mail_str = request.body["mail"];
var memo_str = request.body["memo"];

전송된 폼의 값은 일반 Node.js에서의 방식과는 조금 다르다. request의 “body"에 값이 정리하고 있는 것이다. request.param에서 얻어 오려고 하면 오류가 되므로 주의한다.

레코드 추가

레코드 추가도 기본적으로는 앞전의 select 처리와 실제는 변함이 없다. db.connect으로 데이터베이스에 연결하고 Client 객체의 query 메소드에서 SQL을 실행하는 흐름이다. 단순히 실행하는 SQL의 내용이 변경되었을 뿐이다.

var qstr = "insert into mydata (name,mail,memo) values($1, $2, $3);";
var query = client.query(qstr,[name_str, mail_str, memo_str]);

여기에서는 이렇게 하고 insert 문을 실행하고 있다. 주목하고 싶은 것은 values 이 후에 있는 $1, $2, $3이다. 이것은 query를 실행하면 값이 전달되는 변수이다.

query에는 두번째 인수에, [name_str, mail_str, memo_str]라는 배열이 준비되어 있다. 이 값이 $1, $2, $3에 각각 대입된다. 쿼리 문장의 텍스트에 변수 등의 값을 포함하려면이 같은 $를 사용한 변수를 사용한다.

실행 후에 end 이벤트를 사용하여 실행한 후 첫 페이지로 리디렉션한다. 아래와 같은 부분이다.

query.on('end', function(row,err) {
    response.redirect("/");
});

리디렉션은 Response 객체의 “redirect"를 이용한다. 인수에는 리디렉션 주소를 지정하면 된다. 간단하다.

데이터베이스 액세스에 대한 기능은 이것 뿐이다. 물론 객체의 메소드 이라든지 세세한 것은 아직 남아 있지만, 기본적으로 “connect하고 query한다. 이 후에 이벤트 핸들러에서 처리하면 끝이라는 흐름 알면, 기본적인 데이터베이스 액세스는 대부분 구현할 수 있다.

어쨌든, SQL을 그대로 쓰기 뿐이기에, “세세한 것은 SQL 측에서 어떻게 해야 한다"라는 것이다.