Hướng dẫn nodejs body-parser - nodejs body-parser

  • 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.post(\'/\', function(req, res) {
  Post.create(req.body)
});
9 đượ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ề

app.use(bodyParser.json());
0 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 nodejs body-parser - nodejs body-parser

Điều tiếp theo tôi đã làm là cố gắng kiểm tra

app.use(bodyParser.json());
1 object. Tôi đã cố gắng để tìm thấy data trong
app.use(bodyParser.json());
1 object. Nhưng
app.use(bodyParser.json());
1 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

app.use(bodyParser.json());
4, 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

app.use(bodyParser.json());
4 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(bodyParser.json());
6 đượ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(bodyParser.json());
6 đượ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

app.use(bodyParser.json());
8

app.use(bodyParser.json());
9 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,

app.use(function(req, res) {
  // make somethings
});
0 object được đọc theo stream và
app.use(function(req, res) {
  // make somethings
});
1 đượ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

app.use(bodyParser.json());
1. 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();
  });
});

app.use(function(req, res) {
  // make somethings
});
3 trả về một function hoạt động như một middleware. Chức năng lắng nghe trên
app.use(function(req, res) {
  // make somethings
});
4 và xây dựng
app.use(bodyParser.json());
0 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ó.

app.use(function(req, res) {
  // make somethings
});
3 hỗ trợ các function khác nhau để làm điều này.

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

Với việc sử dụng

app.use(function(req, res) {
  // make somethings
});
3 bạn có thể lấy được data form từ
app.use(bodyParser.json());
0

Tác giả: Bui Xuan Hien

Hướng dẫn nodejs body-parser - nodejs body-parser

Mở đầu

Tiếp tục với series Nodejs cơ bản trong bài hôm nay mình sẽ giới thiệu về

app.use(function(req, res) {
  // make somethings
});
9 cùng với
app.use(\'/test\', cb);
0 và ứng dụng nó để làm chức năng thêm mới. OK vậy bắt tay vào việc luôn nhé
Hướng dẫn nodejs body-parser - nodejs body-parser

Thực Hiện

Ý tưởng

Để thực hiện được chức năng thêm mới :

  • Phía client: phải có một form để người dùng điền thông tin, và phía client phải gửi data mà người dùng nhập lên để phía server tiến hành xử lý.

  • Phía server: phải làm sao đó để bắt được data mà client gửi lên và thực hiện chức năng thêm mới.

    Cơ mà vấn đề ở đây là server sẽ lấy data từ dưới client gửi lên kiểu gì :v, Như ở bài trước của mình thì là dùng

    app.use(\'/test\', cb);
    1 để lấy được data ở url được client gửi lên thế thì cái này thì có cái nào tương tự không nhỉ, đáp án là có đó chính là
    app.use(bodyParser.json());
    0, Nhưng để dùng được
    app.use(bodyParser.json());
    0 thì chúng ta cần phải cài một moudule tên là
    app.use(\'/test\', cb);
    4 mình sẽ nói về module này sau, bây giờ chúng ta cần tạo một file view để người dùng có thể nhập thông tin cho bài viết mới. Mình sẽ tạo một file có tên là
    app.use(\'/test\', cb);
    5 với nội dung như sau:

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

Bên file

app.use(\'/test\', cb);
6 thì khai báo một router để render file
app.use(\'/test\', cb);
5vừa tạo ở trên

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

Ok vậy là đã xong bên client bây giờ chúng ta mở trình duyệt xem thử nhé

Hướng dẫn nodejs body-parser - nodejs body-parser

hiện ra như thế này là oki rồi nhé . Tiếp theo sẽ là xử lý bên server, như đã nói ở trên chúng ta cần cài đặt module

app.use(\'/test\', cb);
8. Như mọi khi thôi để cài đặt module thì chỉ cần chạy lệnh
Hướng dẫn nodejs body-parser - nodejs body-parser
. Tiếp theo sẽ là xử lý bên server, như đã nói ở trên chúng ta cần cài đặt module
app.use(\'/test\', cb);
8. Như mọi khi thôi để cài đặt module thì chỉ cần chạy lệnh

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

là được. Sau khì cài đặt xong thì chúng ta sẽ khai báo trong file

app.use(\'/test\', cb);
6 như sau:

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

Các bạn muốn hiểu rõ hơn thì có thể lên đây để đọc thêm. Tiếp theo mình sẽ log ra xem như thế nào nhé. đây là code

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

Mình nhập vào input như thế này và ấn

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

Hướng dẫn nodejs body-parser - nodejs body-parser

Đây là kết quả log mình nhận được

Hướng dẫn nodejs body-parser - nodejs body-parser

Bây giờ chúng ta sẽ lưu data vừa nhận được nhé, bạn chỉ cần sửa lại

var cb = bodyParser.json();
app.use(cb);
1 vừa viết ở trên như sau:

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

ở đây mình sẽ lưu data lấy từ

app.use(bodyParser.json());
0 vàng mảng
var cb = bodyParser.json();
app.use(cb);
3 sau đó sẽ
var cb = bodyParser.json();
app.use(cb);
4 về trang hiển thị danh sách
var cb = bodyParser.json();
app.use(cb);
3. Ở trang danh sách
var cb = bodyParser.json();
app.use(cb);
3 mình thêm một thẻ
var cb = bodyParser.json();
app.use(cb);
7 để có thể chuyển về trang thêm mới. Đây là kết quả

Hoặc bạn có thể đưa thông tin vừa nhận được ra một trang mới như thế này

bằng cách thêm một file

var cb = bodyParser.json();
app.use(cb);
8 với nội dung như sau :

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

và sửa lại

var cb = bodyParser.json();
app.use(cb);
1 như thế này :

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

kết Luận

Như vậy là mình đã giới thiệu đến các bạn

req.on(\'data\', function(chunk) {
  // here\'s the chunk
});
0 Tuy nhiên có một số lưu ý ở bài viết này đó là dữ liệu người dùng nhập vào chưa được validate trước khi submit, và data được lưu vào mảng nên khi f5 lại sẽ bị mất, Những vẫn đề này sẽ được giải quyết ở những bài tiếp theo. Bài viết dựa trên quan điểm cá nhân nên mọi người có thắc mắc hay góp ý gì thì hãy coment xuống bên dưới để mình được biết, cảm ơn các bạn đã đón đọc.