【问题标题】:Try-catch setup in node.jsnode.js 中的 try-catch 设置
【发布时间】:2018-10-17 14:58:45
【问题描述】:

我正在尝试为以下场景首次设置 try-catch。目前我在 route 中有一个,在 server.js 中,如果有来自 error >controller,即user.js

我也怀疑我是否需要/是否也可以为控制器设置一个 try-catch。

请帮我正确设置。

server.js:

 app.post('/login-user', (req, res) => {
        try {
            user.loginUser(req.body, (err, jResult) => {
                let token = jwt.sign({
                    user: jResult,
                }, "supersecret")
                console.log(jResult)
                return res.send(token)
            })
        } catch (err) {
            console.log(err)
            return res.send(jResult)
        }        
    })

user.js:

user.loginUser = (jUserData, fCallback) => {
    var aData = [
        jUserData.email,
        jUserData.mobile_number,
        1
    ]
    var sQuery = 'SELECT * FROM users WHERE email = ? AND mobile_number = ? AND active = ?'
    db.each(sQuery, aData, function (err, jRow) {
        console.log(jRow)
        if (err) {
            console.log('BAD, user not logged in')
            return fCallback(true, {
                status: "INTERNAL SERVER ERROR"
            })
        }
        if (!Object.keys(jRow).length) {
            console.log('NOT FOUND')
            return fCallback(true, {
                status: "NOT FOUND"
            })
        }
        console.log('GREAT, user logged in')
        return fCallback(false, jRow)
        console.log(jRow)
    })
}

【问题讨论】:

    标签: node.js controller routes try-catch


    【解决方案1】:

    这不会像你想象的那样工作.. 在你的 app.post('/login-user', 处理程序中,try.. catch 块不会捕获错误,因为回调将被异步调用. 这里处理错误的最好方法是 Node.js 中的一个常见模式。如果你在 loginUser 函数中遇到错误,请将 err 变量设置为某个值。例如

    user.loginUser = (jUserData, fCallback) => {
        var aData = [
            jUserData.email,
            jUserData.mobile_number,
            1
        ]
        var sQuery = 'SELECT * FROM users WHERE email = ? AND mobile_number = ? AND active = ?'
        db.each(sQuery, aData, function (err, jRow) {
            console.log(jRow)
            if (err) {
                console.log('BAD, user not logged in')
                return fCallback(new Error('BAD, user not logged in: ' + err.message), {
                status: "INTERNAL SERVER ERROR"
                });
            }
            if (!Object.keys(jRow).length) {
                console.log('NOT FOUND')
                return fCallback(new Error('User not found'), {
                status: "INTERNAL SERVER ERROR"
                });
            }
            console.log('GREAT, user logged in')
            return fCallback(false, jRow)
            console.log(jRow)
        })
    }
    

    然后在 app.post 处理程序中检查 err 变量是否为非空:

     app.post('/login-user', (req, res) => {
        user.loginUser(req.body, (err, jResult) => {
            if (err) {
                console.error(err.message);
                return res.status(500).send('Internal server error');
            }
            let token = jwt.sign({
                user: jResult,
            }, "supersecret")
            console.log(jResult)
            return res.send(token)
        })    
    })
    

    【讨论】:

    • 我知道这种方法,但要求是使用 try..catch,因为从那时起服务器不会像其他错误处理那样崩溃。
    • Hmmm.. 如果登录用户函数返回错误,服务器不应崩溃。也许试一试,看看它是否崩溃?请注意,通常将异步调用包装在 try/catch 块中是行不通的!
    • 如果使用 try/catch 本身确实是一个硬性要求(尽管我同意 Terry 的观点,这不是一个适当的解决方案),您可以考虑使用带有 async/await 语法的 db 的承诺版本。在这种情况下,try/catch 的工作方式与您预期的相似。
    • 以及带有 async/await 语法的 db 的承诺版本会是什么样子?
    • 在这种情况下 user.loginUser 应该返回一个承诺。您可以在异步函数内部调用,例如:let result = await user.loginUser(....)。 .然后你可以将它包装在一个 try/catch 块中,它会像@Szellem 所说的那样工作。
    猜你喜欢
    • 2020-06-19
    • 1970-01-01
    • 2013-07-08
    • 2011-08-13
    • 1970-01-01
    • 2018-10-29
    • 2018-06-28
    • 2014-03-02
    • 1970-01-01
    相关资源
    最近更新 更多