У вас есть несколько проблем в вашей программе, которые вы должны обновить.
Прежде всего, вы не должны использовать глобальную переменную для хранения соединения с базой данных по запросу.Если два запроса поступают одновременно, тогда один запрос перезапишет connection
других созданных запросов, поэтому вы можете использовать одно и то же соединение для обоих запросов и / или не закрывать одно из соединений, что приводит коборванное соединение, которое в худшем случае может привести к тому, что ваше приложение не отвечает.
Чтобы решить эту проблему, вам нужно передать соединение с объектом запроса:
app.use(async function(req, res, next) {
try {
if( req.dbConnection ) {
// ensure that req.dbConnection was not set already by another middleware
throw new Error('req.dbConnection was already set')
}
let connection = mysql.createConnection({
host: 'xx',
user: 'xx',
password: 'xx',
database: 'xx'
});
res.on("finish", function() {
// end the connection after the resonponse was send
req.dbConnection.end()
});
// assign a promise base version of connection to request
req.dbConnection = connection.promise()
// wait for the connection to be established
await connection.connect();
next();
} catch(err) {
next(err);
}
});
Для доступа к определенному запросуДля соединения вы должны сделать что-то вроде этого:
app.get('/', async function(req, res, next) {
try {
await checkIfUserCodeExist(req.dbConnection)
// so something here after `checkIfUserCodeExist` finished
} catch(err) {
next(err); // if an error occured pass it to the next
}
})
async
можно использовать с await
, если в вашем теле функции нет await
, тогда вам не нуженasync
перед функцией.
Если у вас нет await
в теле функции, вам нужно вернуть цепочку Promise из функции, чтобы вызывающая сторона могла дождаться завершения функции:
function checkIfUserCodeExist(connection) {
return connection.query(sqlCheckIfExist)
.then(([rows, fields]) => {
if (rows == 0) {
console.log("Non esiste!")
return res.send(JSON.stringify({
"status": 500,
"response": "codeNotExist"
}));
}
console.log("Esiste!")
console.log(rows[0].my_refer);
return checkIfCodeIsSameAsMine(connection)
})
}
function checkIfCodeIsSameAsMine(connection) {
return connection.query(sqlCodeCheckSameAsMine)
.then(([rows, fields]) => {
if (rows == friendReferCode) {
console.log("Codice uguale!")
return res.send(JSON.stringify({
"status": 500,
"response": "sameCodeAsMine"
}));
}
console.log("Codice non uguale!")
})
}
Если вы хотите использовать async
, это будет выглядеть так:
async function checkIfUserCodeExist(connection) {
let [rows, fields] = await connection.query(sqlCheckIfExist)
if (rows == 0) {
console.log("Non esiste!")
return res.send(JSON.stringify({
"status": 500,
"response": "codeNotExist"
}));
}
await checkIfCodeIsSameAsMine()
console.log("Esiste!")
console.log(rows[0].my_refer);
}
async function checkIfCodeIsSameAsMine(connection) {
let [rows, fields] = await connection.query(sqlCodeCheckSameAsMine)
if (rows == friendReferCode) {
console.log("Codice uguale!")
return res.send(JSON.stringify({
"status": 500,
"response": "sameCodeAsMine"
}));
}
console.log("Codice non uguale!")
}
Вы бы избежали чего-то вроде:
return res.send(JSON.stringify({
"status": 500,
"response": "codeNotExist"
}));
Вместоиз этого вы бы выдавали пользовательскую ошибку вроде:
throw new CustomError(500, "codeNotExist")
и имели бы промежуточное ПО для ошибки:
app.use(function(err, req, res, next) {
return res.send({
"status": err.status,
"response": err.message
});
})
Таким образом, у вас есть только одно место, где вы создаете ответ об ошибке, и вы можете создатьпри необходимости вносит изменения в этот ответ об ошибке, например, добавляет дополнительное ведение журнала.
РЕДАКТИРОВАТЬ (в соответствии с обновленным вопросом)
/* GET users listing. */
router.post('/', function(req, res, next) {
var uid = req.body.uid;
var friendReferCode = req.body.friendReferCode;
var sqlCheckIfExist = "SELECT my_refer FROM hub_user WHERE my_refer = '" + friendReferCode + "'";
var sqlCodeCheckSameAsMine = "SELECT my_refer FROM hub_user WHERE uid = '" + uid + "'";
function checkIfUserCodeExist() {
return req.dbConnection.query(sqlCheckIfExist)
.then(([rows, fields]) => {
if (rows == 0) {
console.log("Non esiste!")
return res.send(JSON.stringify({
"status": 500,
"response": "codeNotExist"
}));
}
console.log("Esiste!")
console.log(rows[0].my_refer);
return checkIfCodeIsSameAsMine(connection)
})
}
function checkIfCodeIsSameAsMine() {
return req.dbConnection.query(sqlCodeCheckSameAsMine)
.then(([rows, fields]) => {
if (rows == friendReferCode) {
console.log("Codice uguale!")
return res.send(JSON.stringify({
"status": 500,
"response": "sameCodeAsMine"
}));
}
console.log("Codice non uguale!")
})
}
checkIfUserCodeExist()
.catch(next)
});