Cách sửa nhanh trong 30 giâyBạn cần sửa nhanh? Bạn chỉ cần cấu hình để Express nới lỏng bộ nhớ hơn. Nếu bạn đang dùng Express 4.16.0 trở lên, hãy thêm tùy chọn limit vào các trình phân tích (parser) JSON và URL-encoded tích hợp sẵn trong file ứng dụng chính:
const express = require('express');
const app = express();
// Tăng giới hạn cho body JSON
app.use(express.json({ limit: '50mb' }));
// Tăng giới hạn cho body URL-encoded
app.use(express.urlencoded({ limit: '50mb', extended: true }));
Đang chạy phiên bản cũ hơn? Nếu bạn vẫn dùng bản Express cũ hoặc gói body-parser riêng biệt, cú pháp cũng gần như tương tự:
const bodyParser = require('body-parser');
app.use(bodyParser.json({ limit: '50mb' }));
app.use(bodyParser.urlencoded({ limit: '50mb', extended: true }));
Tại sao Express lại từ chốiTheo mặc định, Express giới hạn các yêu cầu gửi đến ở mức rất nhỏ: 100KB. Biện pháp bảo vệ này giúp ngăn chặn kẻ tấn công làm sập máy chủ bằng các payload khổng lồ. Đây là một bước bảo mật thông minh, nhưng nó cũng chặn luôn các tệp ảnh 5MB hoặc đối tượng JSON lớn hợp lệ. Khi client gửi một payload vượt quá giới hạn này, middleware sẽ trả về mã trạng thái HTTP 413 và dừng yêu cầu ngay lập tức.
PayloadTooLargeError: request entity too large at readStream (.../node_modules/body-parser/lib/read.js:71:17)
Nơi áp dụng các thay đổi### 1. Middleware tích hợp sẵn của ExpressNếu bạn dùng Express 4.16+, bạn không cần gói body-parser bổ sung. Hãy cấu hình giới hạn trực tiếp trong file app.js hoặc server.js. Đảm bảo các dòng này xuất hiện trước các định nghĩa route của bạn, nếu không chúng sẽ không có tác dụng.
// server.js
const express = require('express');
const app = express();
// Điều chỉnh các giới hạn này dựa trên nhu cầu thực tế của ứng dụng
app.use(express.json({ limit: '25mb' }));
app.use(express.urlencoded({
limit: '25mb',
extended: true,
parameterLimit: 50000
}));
app.post('/api/upload', (req, res) => {
console.log('Kích thước body nhận được:', JSON.stringify(req.body).length);
res.send('Thành công');
});
2. Xử lý tải tệp (Multipart/Form-Data)Giới hạn của express.json() sẽ không giúp ích gì cho việc tải tệp được xử lý bởi multer hoặc busboy. Bạn phải thiết lập giới hạn bên trong middleware cụ thể đó:
const multer = require('multer');
const upload = multer({
limits: { fileSize: 50 * 1024 * 1024 } // Giới hạn 50MB
});
app.post('/profile', upload.single('avatar'), (req, res) => {
res.send('Đã tải tệp lên!');
});
3. Nút thắt cổ chai NginxĐôi khi code không có vấn đề gì, nhưng hạ tầng lại là rào cản. Nếu bạn đã cập nhật Node.js nhưng vẫn thấy lỗi 413, Nginx có khả năng là người gác cổng. Theo mặc định, Nginx từ chối bất kỳ yêu cầu nào lớn hơn 1MB.
Cập nhật cấu hình Nginx của bạn (thường nằm ở /etc/nginx/nginx.conf hoặc file cấu hình riêng của trang web):
server {
client_max_body_size 50M;
location / {
proxy_pass http://localhost:3000;
}
}
Đừng quên kiểm tra và tải lại dịch vụ:
sudo nginx -t
sudo systemctl reload nginx
Cách kiểm chứng lỗi đã được sửaĐừng chỉ nghe lời chúng tôi—hãy kiểm tra giới hạn mới. Bạn có thể sử dụng curl để gửi một payload lớn hơn mặc định 100KB cũ nhưng nhỏ hơn ngưỡng mới của bạn.
Đầu tiên, tạo một file JSON giả nặng 200KB:
node -e "console.log(JSON.stringify({data: 'x'.repeat(200000)}))" > large_payload.json
Sau đó, gửi nó tới server local của bạn:
curl -X POST -H "Content-Type: application/json" -d @large_payload.json http://localhost:3000/your-endpoint
Nếu bạn nhận được 200 OK thay vì 413 Payload Too Large, nghĩa là mọi thứ đã ổn.

