This code violates the KISS principle by combining too many concerns in a single middleware: token extraction, validation, user fetching, response format handling, and error handling. A better approach would be to separate these concerns:
const extractToken = (req) => {
return req.headers.authorization?.split(' ')[1] ||
req.query.token ||
req.cookies.token ||
req.body.token;
};
const formatResponse = (req, res, status, payload) => {
if (req.accepts('json')) {
return res.status(status).json(payload);
}
return req.accepts('html') ?
res.redirect('/login') :
res.status(status).send(payload.error);
};
const authenticate = async (req, res, next) => {
try {
const token = extractToken(req);
if (!token) {
return formatResponse(req, res, 401, { error: 'No token provided' });
}
req.user = await validateTokenAndGetUser(token);
next();
} catch (error) {
formatResponse(req, res, 401, { error: error.message });
}
};