node.js请求卡在中间件功能(身份验证)?

问题描述 投票:0回答:1

我正在构建一个node.js服务器来处理我的iOS应用程序中的登录和操作。我编写的函数之一是checkAuth,它是我的大部分请求的中间件,用于检查用户是否经过身份验证并且有权执行他想要执行的操作。

现在我遇到了一个问题,有时候,但并不总是,中间件功能(checkAuth)卡住了。我在我的控制台中从此函数接收日志,但请求中没有任何内容(在身份验证成功后应该会发生)。

这是我目前写的功能。它还没有优化,因为我正在测试一切,但它应该做我想要它做的事情(而且它确实在大多数情况下):

const saltRounds = process.env.JWT_ROUNDS
const secret = process.env.JWT_SECRET
const checkRefreshTime = 10 // set to 10 seconds for testing, will increase later

function checkAuth(req, res, next) {
    var token = req.headers['x-access-token']
    jwt.verify(token, secret, (error, decoded) => {
        console.log("checking auth")
        if(error) {
            console.log(error)
            res.json({ errorCode: 406 })
        } else {
            const decoded = jwt.verify(token, secret)
            var checkTime = (Date.now() / 1000) - checkRefreshTime;
            if (decoded.iat < checkTime) {
                console.log("DEC:", decoded)
                const userID = decoded.userID
                const queryString = "SELECT userRefreshToken, userName, userDisplayName, userProfilePicURL, userDOB, userGender FROM users WHERE userID = ? LIMIT 1"
                pool.getConnection(function(error, connection) {
                    if(error) {
                        console.log(error)
                        res.json({ errorCode: 500 })
                    }
                    connection.query(queryString, [userID], (error, selectRows, fields) => {
                        if(error) {
                            console.log(error)
                            res.json({ errorCode: 500 })
                        }
                        if(selectRows.length > 0) {
                            if(selectRows[0].userRefreshToken == decoded.userRefreshToken) {
                                var userAge = moment().diff(selectRows[0].userDOB, 'years');
                                const payload = {
                                    userID: userID,
                                    userName: selectRows[0].userName,
                                    userDisplayName: selectRows[0].userDisplayName,
                                    userProfilePicURL: selectRows[0].userProfilePicURL,
                                    userRefreshToken: selectRows[0].userRefreshToken,
                                    userAge: userAge,
                                    userGender: selectRows[0].userGender
                                }
                                var newToken = jwt.sign(payload, secret, { expiresIn: '21d' });
                                console.log("new token sent ", newToken)
                                res.locals.authToken = newToken
                                console.log("moving to next")
                                return next()
                            } else {
                                console.log("wrong refresh token")
                                res.json({ errorCode: 405, authResult: false })
                            }
                        } else {
                            console.log("0 results found!")
                            res.json({ errorCode: 503, authResult: false })
                        }
                        connection.release()
                    })
                })
            } else {
                console.log("moving to next 2")
                return next()
            }
        }
    })
}

它可能不是你见过的最漂亮的代码。这不是我现在的问题 - 我会在以后进行优化。现在我担心有时在第二次检查后功能被卡住了。我接收的最后一个输出是“DEC:”,然后是我的控制台中的解码标记(第16行)。

其他有用的信息:我在DigitalOcean的Ubuntu 18.04服务器上运行我的服务器并永远使用它来保持运行:forever start --minUptime 1000 --spinSleepTime 1000 server.js

谁知道为什么会这样?

编辑:根据评论,pool的定义

var pool = mysql.createPool({
    connectionLimit: 100,
    host: process.env.DB_HOST,
    user: process.env.DB_USER,
    password: process.env.DB_PASS,
    database: process.env.DB_BASE,
    ssl      : {
          ca   : fs.readFileSync('***********'),
          key  : fs.readFileSync('*********'),
          cert : fs.readFileSync('********'),
    },
    charset : 'utf8mb4',
    dateStrings: true
})
node.js express authentication jwt middleware
1个回答
0
投票

我没有看到pool在哪里被定义。这可能会在服务器日志中引发错误。

在连接函数中放置一个控制台日志,以检查它是否实际连接到mySQL,因为这是链中的下一个函数。

© www.soinside.com 2019 - 2024. All rights reserved.