NodeJS瀑布响应不同于瀑布回调的错误

时间:2018-03-24 00:57:17

标签: mysql node.js express async.js waterfall

我想知道在发生内部服务器错误时,在NodeJS Express应用程序中进行服务器响应的正确方法是什么。这是一些注册用户的简化代码。主要问题是,如果发生内部服务器错误,我想记录错误,但也用不同的消息响应客户端。我下面的内容是我目前的解决方案,但我觉得我没有正确地做到这一点(或者不遵循传统方式)。我目前有一个从路由调用的异步瀑布设置。

//Controller.js
function verifyInputs(user, resCallback, callback) {
    //verify user inputs (ie. passwords match)
    if (valid) {
        callback(null)
    } else {
        resCallback('whatever was wrong with inputs', 409)
        callback('ok')
    }
}

function checkIfUserExists(user, resCallback, callback) {
    db.getPool().getConnection((err, connection) => {
        if (err) {
            resCallback('custom response error message', 500)
            callback(err)
            return
        }
        var sql = 'SELECT...'
        connection.query(sql, (err, results) => {
            connection.release()
            if (err) {
                resCallback('another custom response error', 500)
                callback(err)
                return
            }
            if (results.length > 0) {
                resCallback('user already exists')
                callback('ok')
            }
        })
    )
}

module.exports.registerNewUser(user, callback) {
    async.waterfall([
        async.apply(user, callback, verifyInputs),
        async.apply(user, callback, checkIfUserExists)
    ],
    function(err, reults) {
        if (err === 'ok') return
        //log error or whatever here    
    })
}

从路由功能调用此寄存器功能:

//Router.js
router.post('/register', (req, res, next) => {
    var newUser = //get user data from req
    controller.registerNewUser(newUser, (msg, statusCode) => {
        res.statusCode(statusCode)
        res.send(msg)
    })
})

上面的代码显示了在使用其他消息响应客户端时如何记录错误。这是正确的还是可行的方法?

或者也许我根本不应该使用瀑布,并做这样的事情,这样我就可以在没有多个回调的情况下访问所有阶段的res对象:

router.post('/register', verifyInputs(), checkIfUserExists(), (req, res, next) => {
    var newUser = //get user data from req
    controller.registerNewUser(newUser, (msg, statusCode) => {
        res.statusCode(statusCode)
        res.send(msg)
    })
})

我对服务器后端编程比较陌生,我是NodeJS和Express的新手。我只是想确定我正在做的事情。

0 个答案:

没有答案