首页 > 解决方案 > express js错误 - 发送后无法设置标题

问题描述

我正在尝试使用 express js 创建一个登录系统。它工作正常,但登录后在终端中打印错误。这是错误:

Error: Can't set headers after they are sent.
    at validateHeader (_http_outgoing.js:491:11)
    at ServerResponse.setHeader (_http_outgoing.js:498:3)
    at ServerResponse.header (/home/amruth/softwareproject/node_modules/express/lib/response.js:771:10)
    at ServerResponse.send (/home/amruth/softwareproject/node_modules/express/lib/response.js:170:12)
    at done (/home/amruth/softwareproject/node_modules/express/lib/response.js:1008:10)
    at Object.exports.renderFile (/home/amruth/softwareproject/node_modules/pug/lib/index.js:446:12)
    at View.exports.__express [as engine] (/home/amruth/softwareproject/node_modules/pug/lib/index.js:491:11)
    at View.render (/home/amruth/softwareproject/node_modules/express/lib/view.js:135:8)
    at tryRender (/home/amruth/softwareproject/node_modules/express/lib/application.js:640:10)
    at Function.render (/home/amruth/softwareproject/node_modules/express/lib/application.js:592:3)
    at ServerResponse.render (/home/amruth/softwareproject/node_modules/express/lib/response.js:1012:7)
    at /home/amruth/softwareproject/routes.js:116:11
    at Layer.handle [as handle_request] (/home/amruth/softwareproject/node_modules/express/lib/router/layer.js:95:5)
    at next (/home/amruth/softwareproject/node_modules/express/lib/router/route.js:137:13)
    at Route.dispatch (/home/amruth/softwareproject/node_modules/express/lib/router/route.js:112:3)
    at Layer.handle [as handle_request] (/home/amruth/softwareproject/node_modules/express/lib/router/layer.js:95:5)

这是代码:

router.get('/signup', function (req, res) {
    res.render('signup');
});

router.post('/signup', function (req, res) {
    if (!req.body.gmail || !req.body.password) {
        res.status("400");
        res.send("Invalid details");
    }
    else {
        Users.filter(function (user) {
            if (user.gmail == req.body.gmail) {
                console.log(user.gmail);

                res.render('signup', { message: "Gmail already exists" });
            }
        });

        var newUser = { gmail: req.body.gmail, password: req.body.password };
        Users.push(newUser);

        console.log(Users.length);

        req.session.user = newUser;

        console.log(req.session.user);

        res.redirect('/secret');
    }
});

function checkSignIn(req, res, next) {
    if (req.session.user) {
        next();
    }
    else {
        var err = new Error("Not logged in!");
        next(err);
    }
}

router.get('/secret', checkSignIn, function (req, res) {
    res.render('secret', { id: req.session.user.gmail });
});

router.get('/login', function (req, res) {
    res.render('login');
});

router.post('/login', function (req, res) {
    //console.log(Users);
    if (!req.body.gmail || !req.body.password) {
        res.render('login', { message: "Please enter valid info" });
    }
    else {
        Users.filter(function (user) {
            if (user.gmail == req.body.gmail && user.password == req.body.password) {
                req.session.user = user;

                res.redirect('/secret');
            }
        });

        res.render('login', { message: "Invalid credentials" });
    }
});

router.get('/logout', function (req, res) {
    req.session.destroy(function () {
        console.log("user logged out.")
    });

    res.redirect('/login');
});

router.use('/secret', function (err, req, res, next) {
    console.log(err);

    res.redirect('/login');
});

标签: node.jsexpress

解决方案


这是因为即使您已经发送(在检查了匹配电子邮件 ID 等条件之后),您仍在发送响应。return发送响应后,使用关键字停止执行以下代码行。例如:

if(!req.body.gmail || !req.body.password)
{
   return res.status("400").send("Invalid details");
}

还要注意,您可以像这样将状态代码与响应对象附加在一起


推荐阅读