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?

    Guest

    - 1970/01/01 Trả lời

    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.

10 bình luận