मैं अपने आईओएस ऐप में लॉगिन और कार्यों को संभालने के लिए नोड.जेएस सर्वर बना रहा हूं। मेरे द्वारा लिखे गए कार्यों में से एक चेकएथ है, जो मेरे अधिकांश अनुरोधों के लिए मिडलवेयर है ताकि यह जांचा जा सके कि कोई उपयोगकर्ता प्रमाणित है या नहीं और उसे वह करने की अनुमति है जो वह करना चाहता है।

अब मुझे एक समस्या का सामना करना पड़ रहा है जहां कभी-कभी, लेकिन हमेशा नहीं, मिडलवेयर फ़ंक्शन (चेकएथ) अटक जाता है। मुझे अपने कंसोल में इस फ़ंक्शन से लॉग प्राप्त होते हैं, लेकिन अनुरोध से कुछ भी नहीं (जो प्रमाणीकरण के सफल होने के बाद होना चाहिए)।

यह वह कार्य है जिसे मैंने वर्तमान में लिखा है। यह अभी तक अनुकूलित नहीं है क्योंकि मैं हर चीज का परीक्षण कर रहा हूं, लेकिन इसे वही करना चाहिए जो मैं इसे करना चाहता हूं (और यह ज्यादातर समय करता है):

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
})
0
PennyWise 1 मार्च 2019, 20:28

1 उत्तर

सबसे बढ़िया उत्तर

मैं नहीं देखता कि pool को कहीं भी परिभाषित किया गया है। यह सर्वर लॉग में एक त्रुटि फेंक सकता है।

कनेक्शन फ़ंक्शन में एक कंसोल लॉग डालें ताकि यह जांचा जा सके कि यह वास्तव में mySQL से जुड़ा है क्योंकि यह श्रृंखला में अगला फ़ंक्शन है।

0
Borduhh 2 मार्च 2019, 16:50