Я помню эту проблему несколько лет назад, когда я пытался использовать модуль mysql в приложении expressJS
и пытался использовать async/await
.Ошибка также может быть вызвана запросом соединения, в котором произошла фатальная ошибка, см. здесь .Таким образом, лучшие практики предписывают, что при запросах вы открываете соединение, запускаете транзакцию запроса, фиксируете запрос, а затем освобождаете соединение, что позволяет вам откатываться при возникновении ошибки.Я не вижу, чтобы этот процесс происходил здесь, так что это может быть возможным.
В любом случае, я могу предоставить вам альтернативу, которой я и стал в конечном итоге.По сути, я сам отвлекся на обещание query()
и вместо этого позволил узлу обработать его .
Пример использования запроса без транзакции:
/ backend / database / database.js
const mysql = require('mysql');
const db = require('../config/config').mysql;
const util = require('util');
const pool = mysql.createPool({
connectionLimit: require('../config/config').cLimit,
host: db.host,
user: db.user,
password: db.password,
database: db.database
});
pool.query = util.promisify(pool.query);
async function query(cmd) {
try {
let result = await pool.query(cmd);
return result;
} catch(error) {
console.error(error);
}
}
module.exports = {
query
};
Какойзатем может использоваться в ваших моделях, например:
/ backend / models / User.js
const db = require('../database/database');
async function getUserById(userId) {
const cmd = `SELECT * FROM Users WHERE userId = ${userId}`;
try {
let result = await db.query(cmd);
return result;
} catch(error) {
throw {
message: error
}
}
}
module.exports = {
getUserById
};
Который, в свою очередь, может быть вызван из вашего обработчика маршрутавроде таких:
/ backend / routs / users.js
const router = require('express').Router();
const User = require('../models/User');
router.get('/getUserById/:userId', async (req, res) => {
try {
let user = await User.getUserById(req.params.userId);
res.status(200).send({ user });
} catch(error) {
console.error(error);
res.status(400).send({ error: 'Unable to fetch user' });
}
});
module.exports = router;