Những mẹo cần biết khi sử dụng NodeJS

4 min


1048
1.5k share, 1048 points

Tùy chỉnh validate  bằng cách sử dụng 2 field với Mongoose

Để thực hiện tùy chỉnh xác thực bằng cách sử dụng 2 field với Mongoose khi kết nối với app NodeJS, chúng ta có thể tạo một schema tùy chỉnh và một hàm xác thực. Sau đó chuyển nó dưới dạng giá trị của một trường trong đối tượng mà truyền vào hàm tạo Schema.

Ví dụ, chúng ta có thể viết:

const dateRangeSchema = {
  startDate: { type: Date },
  endDate: { type: Date }
};const checkDates = (value) => {
  return value.endDate < value.startDate;
}const schema = new Schema({
  dateRange: { type: dateRangeSchema, validate: checkDates }
});

Chúng ta đã tạo dateRangeSchema với các field startDate và endDate.

Ngoài ra, đã tạo hàm checkDates để trả về range ngày.

Và sau đó truyền cả hai vào đối tượng để chỉ định kiểu dữ liệu cho field.

Chúng ta cũng có thể chuyển callback để validate  bằng cách viết:

schema.pre('validate', function(next) {
  if (this.startDate > this.endDate) {
    next(new Error('start date is after the end date'));
  } else {
    next();
  }
});

Chúng ta nhận các giá trị startDate và endDate từ model và gọi next với lỗi nếu startDate lớn hơn endDate .

Nếu không, chúng ta gọi next mà không có gì để tiến hành

Định dạng ngày từ MongoDB

Chúng ta có thể định dạng một ngày từ MongoDB khi kết nói với app NodeJS bằng phương thức toDateString.

Ví dụ, chúng ta có thể viết:

Schema
  .virtual('date')
  .get(function() {
    return this._id.generationTime.toDateString();
  });

Chúng ta cũng có thể sử dụng thư viện moment.js để dễ dàng hơn.

Ví dụ, chúng ta có thể viết:

Schema
  .virtual('date')
  .get(function() {
    return moment(this._id.generationTime).format("YYYY-MM-DD HH:mm");
  });

We called the format method to format the moment object created from the moment function into the date format we want.

Chúng ta đã gọi phương thức format để định dạng object ngày được tạo từ hàm moment  thành định dạng ngày tháng mà chúng ta muốn.

Nó được trả về dưới dạng string(chuỗi.)

Biến trong Class Name trong Jade/Pug Template

Chúng ta có thể thêm vào một chuỗi thành mẫu Jade / Pug bằng cách viết:

div(class="language-#{session.language}")

Listen tất cả interface thay vì chỉ Localhost trong app Express

Chúng ta listen tất cả các interface trong app Express bằng cách chuyển vào ‘0.0.0.0’ làm argument thứ hai của listen.

Ví dụ, chúng ta có thể viết:

const express = require('express');
const app = express();
app.listen(3000, '0.0.0.0');

Truy cập Biến EJS trong Logic NodeJS

Nếu chúng ta có route renders template EJS, có thể hiển thị biến được chuyển vào từ method render .

Ví dụ, chúng ta có thể viết:

app.get("/post/:title, (req, res) => {
  //...
  res.render("post", { title, description });
}

để tạo route của chúng ta ,

Sau đó, trong template EJS, chúng ta có thể viết:

<% if (title) { %>
     <h2>Post</h2>
     <script>
        const postTitle = <%= title %>
     </script>
<% } %>

Chúng ta lấy title  từ object trong argument thứ 2.

Sau đó, chúng ta thêm tiêu đề vào template.

Bây giờ chúng ta có thể gán nó cho một biến.

Response Kết thúc response POST trên Express

Chúng ta call res.end để kết thúc response

Ví dụ, chúng ta có thể viết:

res.end('hello');

Hoặc chúng ta có thể render template và sau đó call res.end:

res.render('some.template');
res.end();

Tắt Server Express một cách cẩn thận khi quy trình bị hủy

Chúng ta có thể listen các tín hiệu SIGTERM và SIGINT . Sau đó chạy code trong trình xử lý cho các tín hiệu đó và đóng server trong lệnh callback.

Đoạn code sẽ như sau

const express = require('express');const app = express();app.get('/', (req, res) => res.send('hello'});const server = app.listen(3000);setInterval(() => server.getConnections((err, connections) =>  {
  console.log(`${connections} connections currently open`)
}), 1000);process.on('SIGTERM', shutDown);
process.on('SIGINT', shutDown);let connections = [];server.on('connection', connection => {
  connections.push(connection);
  connection.on('close', () => {
    connections = connections.filter(curr => curr !== connection)
  });
});const shutDown = () => {
  server.close(() => {
    process.exit(0);
  });  setTimeout(() => {
    process.exit(1);
  }, 10000);  connections.forEach(curr => curr.end());
  setTimeout(() => connections.forEach(curr => curr.destroy()), 5000);
}

Chúng ta listen các tín hiệu SIGTERM và SIGINT với method process.on.

Và truyền vào function shutDown, nơi call server.close để đóng các kết nối.

Chúng ta cũng thoát với code 1 sau 10 giây nếu các kết nối không được đóng

Các kết nối được lưu trữ trong array connection và call end để đóng mỗi kết nối được tạo ra.

Và cũng call destroy để phá hủy các kết nối sau 5 giây.

Các kết nối báo hiệu từ trình xử lý event connection nơi đẩy các đối tượng kết nối mới vào mảng connections .

Thêm trình xử lý close với method filter .

Kết luận

Qua bài viết, bạn đã có thêm những mẹo hữu ích giúp cho việc code dễ dàng và thuận tiện hơn

Tham khảo thêm về NodeJS tại đây: Những điều nên tránh khi build NodeJS


Like it? Share with your friends!

1048
1.5k share, 1048 points

What's Your Reaction?

hate hate
0
hate
confused confused
0
confused
fail fail
1
fail
fun fun
0
fun
geeky geeky
0
geeky
love love
0
love
lol lol
0
lol
omg omg
0
omg
win win
1
win