Contents
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

Bài viết này được sưu tầm và tổng hợp từ nhiều nguồn trên Internet.
Nếu có gì không hiểu thì inbox messenger bên dưới mình hỗ trợ thêm nhé.