由于回调,标头被发送两次

时间:2015-04-07 04:48:52

标签: node.js express

var mysql = require('mysql');
var express = require("express");
var router = express.Router();

var mysqlPool = mysql.createPool({...});

router.post("/", function(req, res, nxt) {
    req.assert('email', 'Valid email required').notEmpty().isEmail();
    var errors = req.validationErrors(true);

    if (errors) {
        mysqlPool.getConnection(function(err, conn) {
            if(err) return nxt(err);
            conn.query( 'SELECT * FROM guestbook', function( err, result ) {
                conn.release();
                return res.render("index", {signs: result, errors: errors || {}})
            });
        });
    }

    mysqlPool.getConnection(function(err, conn) {
        if(err) return nxt(err);
        conn.query( 'INSERT INTO guestbook ( name, email, message ) VALUES ( ?, ?, ? )',
            [ req.body.name, req.body.email, req.body.message ],
            function( err, result ) {
                conn.release();
                req.flash( 'success_msg', 'Successfully signed guestbook' );
                res.redirect( "/" );
        });
    });
});

您好,我是node.js的新手

这是我面临的问题,如果有验证错误,此代码将生成Can't set headers after they are sent

我完全清楚为什么会发生这种情况 这是因为mysqlPool.getConnection中的异步回调被注册,然后流程在它之后直接继续到下面的代码

要解决此问题,我添加return声明

if (errors) {
    return mysqlPool.getConnection(function(err, conn) {...});
}

return mysqlPool.getConnection(function(err, conn) {...});

是的,它确实解决了我的问题 但我觉得它有问题。
有没有更好的方法来解决这类问题?

0 个答案:

没有答案