Express.js Error: Can't set headers after they are sent

Em có một trang được viết sử dụng Node.js và Express, trong đó em cần phải xác thực người dùng khi họ truy cập vào trang /dashboard.

Đoạn code để xử lý việc xác thực này như sau:

var auth = require('auth');
app.get('/dashboard', function (req, res) {
        var user = auth.check();
        if (!user) {
                res.send('Unauthorized');
        }   
        res.send('Welcome ' + user.username);
});

Khi lauch ứng dụng trên máy local và truy cập vào trang dashboard thì em thấy Node.js văng ra lỗi này:

Error: Can't set headers after they are sent.
    at ServerResponse.OutgoingMessage.setHeader (_http_outgoing.js:335:11)
    at ServerResponse.header (/home/trananh/tmp/myapp/node_modules/express/lib/response.js:719:10)
    at ServerResponse.contentType (/home/trananh/tmp/myapp/node_modules/express/lib/response.js:552:15)
    at ServerResponse.send (/home/trananh/tmp/myapp/node_modules/express/lib/response.js:139:14)
    at /home/trananh/tmp/myapp/app.js:49:6
    at Layer.handle [as handle_request] (/home/trananh/tmp/myapp/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/trananh/tmp/myapp/node_modules/express/lib/router/route.js:131:13)
    at Route.dispatch (/home/trananh/tmp/myapp/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/trananh/tmp/myapp/node_modules/express/lib/router/layer.js:95:5)
    at /home/trananh/tmp/myapp/node_modules/express/lib/router/index.js:277:22

Ứng dụng thì vẫn chạy bình thường nhưng em không hiểu tại sao lại có thông báo lỗi như ở trên?

1 Câu Trả Lời

Trung Quân Trung Quân

Nguyên nhân của lỗi trên là do trong biểu thức điều kiện if bạn không return sau khi gửi header trong trường hợp người dùng chưa được xác thực.
Do đó khi chạy ứng dụng và truy cập vào trang dashboard với tài khoản chưa đăng nhập thì Express sẽ phải thực hiện thao tác gửi header hai lần.

Để fix lỗi trên bạn sửa lại đoạn code như sau:

if (!user) {
        return res.send('Unauthorized');
}   
res.send('Welcome ' + user.username);

Và chạy lại ứng dụng để kiểm tra.

Nội dung tối thiểu 100 ký tự

Câu Hỏi Liên Quan