Hướng dẫn body-parser nodejs

  • Xây dựng App đơn giản với NodeJS, ExpressJS và Socket.IO
  • 9 tip tối ưu code Nodejs dành cho lập trình viên

Khi lần đầu học Express, tôi đã có file app.js được viết cho tôi và tôi chỉ phải thêm một vài routes như sau để nó họat động.

app.get(\'/\', function(req, res) {
  // get posts
  res.json(posts)
});

Nhưng sau đó, tôi đã thử setup một project Nodejs với Express từ đầu và đã cố tạo routes giống như sau

app.post(\'/\', function(req, res) {
  Post.create(req.body)
});

nhưng nó đã không làm việc. Và errors thông báo nói về req.body không tồn tại. Tôi thực sự không hiểu lý do tại sao nó không hoạt động mặc dù tôi đã làm tất cả theo đúng trình tự.

Hướng dẫn body-parser nodejs

Điều tiếp theo tôi đã làm là cố gắng kiểm tra req object. Tôi đã cố gắng để tìm thấy data trong req object. Nhưng req object quá lớn và khó hiểu và tôi không thể thực sự tìm thấy những data mà tôi đang tìm kiếm.

Cuối cùng, tôi đã tìm đến bodyParser(), và tôi đã được biết

Bạn cần phải sử dụng bodyParser() nếu bạn muốn data form có sẵn trong req.body

Nhưng tôi vẫn không thực sự hiểu tại nó hoạt động như thế nào.

app.use()

Trước tiên để sử dụng bodyParser() bạn cần sử dụng đoạn code như sau:

app.use(bodyParser.json());

Để hiểu cách thức hoạt động trên, bạn phải hiểu cách middleware hoạt động trong Express. Cụ thể, khi app.use() được sử dụng với đối số làm một function:

app.use(function(req, res) {
  // make somethings
});
  • Function sẽ đựợc thực hiện với mọi request
  • Function này sẽ hoạt động như một middleware.

Đối lập với khi app.use() được gọi với đối số là một string

app.use(\'/test\', cb);

Nó sẽ chỉ match với request bắt đầu với /test

bodyParser.json() trả về một function và khi function đó được dùng làm đối số cho app.use, nó hoạt động giống như bất kỳ middleware khác.

var cb = bodyParser.json();
app.use(cb);

Data form trong req object

Thông tin được gửi qua internet qua các gói tin. Trong Nodejs, request object được đọc theo stream và response được ghi bởi stream.

req.on(\'data\', function(chunk) {
  // here\'s the chunk
});

Mỗi lần một đoạn của dữ liệu đến, bạn có thể sử dụng nó. Ví dụ một chuỗi như sau

abcdefghijklmnopqrstuvwxyz

cũng có thể là 5 đoạn

abcde
fghij
klmno
pqrst
uvwxyz

và bạn có khả năng truy cập mỗi đoạn dữ liệu.

Như vậy dữ liệu POST sẽ không có sẵn trên đối tượng req. Nếu bạn muốn truy cập dữ liệu POST, bạn phải lấy nó từ stream

app.use(function( req, res, next ) {
  var data = \'\';
  req.on(\'data\', function( chunk ) {
    data += chunk;
  });
  req.on(\'end\', function() {
    req.rawBody = data;
    console.log( \'on end: \', data )
    if (data && data.indexOf(\'{\') > -1 ) {
      req.body = JSON.parse(data);
    }
    next();
  });
});

bodyParser trả về một function hoạt động như một middleware. Chức năng lắng nghe trên req.on (\'data\') và xây dựng req.body từ các đoạn dữ liệu mà nó nhận được.

Nhưng có một số lưu ý. Về cơ bản, có nhiều cách khác nhau để định dạng dữ liệu bạn POST đến server:

  • application/x-www-form-urlencoded
  • multipart/form-data
  • application/json
  • application/xml
  • maybe some others

Nói tóm lại, bodyParser phải phân tích dữ liệu một cách khác nhau tùy thuộc vào loại của nó. bodyParser hỗ trợ các function khác nhau để làm điều này.

// for parsing application/json
app.use(bodyParser.json()); 

// for parsing application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: true })); 

// for parsing multipart/form-data
app.use(multer());

Với việc sử dụng bodyParser bạn có thể lấy được data form từ req.body

Tác giả: Bui Xuan Hien

1. Mở đầu

Lần đầu tìm hiểu về Nodejs, tôi có thử tạo một project với mục đích gửi form và có đoạn code như sau:

app.get("/", function(req, res) {
  res.json(posts)
});
app.post("/", function(req, res) {
  Post.create(req.body)
});

Nhưng lỗi trả về là không tìm thấy req.body. Tôi đã thử kiểm tra req nhưng rất khó để có thể lấy được dữ liệu tôi đã gửi lên. Sau khi tìm hiểu, tôi đã biết tới body-parser

2. Cài đặt

Những library liên quan

  • Express: Một trong những framework được ưa chuộng nhất của Nodejs
  • body-parser: Lấy được dữ liệu nhập vào (như trong req.body)
  • EJS: Template engine hỗ trợ sinh html động
  • Moment.js: Để thiết đặt hiển thị thời gian một cách đơn giản

3. Demo

Chúng ta hãy cùng xem ví dụ sau: Cho nhập vào một message, hiển thị message và thời điểm ghi ra message đó. Mặc dù là demo nhỏ nhưng tôi muốn hướng dẫn cụ thể hơn một chút cho những bạn mới tìm hiểu Nodejs như tôi

  1. Tạo folder project
  2. cd vào folder đó
  3. Trên terminal gõ: npm init
  4. Điền các thông tin cần thiết

Cài đặt module

npm i --save express body-parser ejs moment

File package.json sau khi được tạo theo cách trên có thể có nội dung khác như bên dưới nhưng đừng bận tâm.

{
    "name": "body-parser-post-html",
    "private": true,
    "scripts": {
        "start": "node app"
    },
    "dependencies": {
        "body-parser": "^1.19.0",
        "ejs": "^2.7.1",
        "express": "^4.17.1",
        "moment": "^2.24.0"
    }
}

Trong cùng thư mục với package.json tạo một file app.js với nội dung:

var express = require("express");
var path = require("path");
var bodyParser = require("body-parser");
var routes = require("./routes")

app = express();

app.set("views", path.resolve(__dirname, "views"));
app.set("view engine", "ejs");

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

app.use(routes);

app.listen(3000);

Hãy để ý câu lệnh sau app.use(bodyParser.urlencoded({ extended: false })) . Nó mang ý nghĩa là một đối tượng body chứa dữ liệu mà đã được parsed sẽ được đưa vào request (có thể hiểu là req.body). Dữ liệu đó là một cặp key-value, trong đó value có thể là array hoặc string nếu extended: false và các loại còn lại nếu extended: true.

Ngoài ra, module body-parser cung cấp những parsers nổi bật như sau:

  • JSON body parser
  • Raw body parser
  • Text body parser
  • URL-encoded form body parser

Tiếp tục trong cùng thư mục với package.json tạo một file router.js với nội dung:

var express = require("express");
var moment = require("moment");
var router = express.Router();

router
    .get("/", (req, res) => {
        res.render("index", {
            message: "Please enter a message",
            date: "Time will be show"
        });
    })
    .post("/", (req, res) => {
        res.render("index", {
            message: req.body.message,
            date: moment().format("YYYY-MM-DD HH:mm:ss")
        });
    });

module.exports = router;

Trong cùng thư mục với package.json tạo một folder views, trong folder views đó tạo một file index.ejs với nội dung:

<%= message %>

<%= date %>

Chạy câu lệnh

npm start

và truy cập http://localhost:3000/ sẽ hiển thị như sau:

Hướng dẫn body-parser nodejs

Khi nhập message và nhấn send, ta có kết quả:

Hướng dẫn body-parser nodejs

Qua bài viết này, tôi muốn giới thiệu cho các bạn một trong những cách sử dụng module Body-Parser để xử lý form nhập vào.

Tôi mới tìm hiểu về Nodejs và các module hay sử dụng, vì vậy nội dung bài viết có thể còn chưa rõ ràng và nhầm lẫn, mong nhận được sự góp ý của các bạn. Xin cảm ơn.


https://github.com/expressjs/body-parser https://qiita.com/atlansien/items/2dad964467874b846f04 https://noumenon-th.net/programming/2018/12/17/bodyparser01/