请帮助我正在尝试将我的应用程序部署到App Engine / CloudSQL,但我一直在获取:
“ UnhandledPromiserejectWarning”:致命错误后无法排队。
我正在尝试以MySQL的身份查询MySQL,当我不处理该异常时,它在本地运行良好,但是在部署时不起作用。
如何处理承诺拒绝,请帮助谢谢
这是db.js
const db = require('./Mysql')
const query = (q, data) => {
return new Promise((resolve, reject) => {
db.query(q, data, (err, res) => (err ? reject(err) : resolve(res)))
})
.then(res => console.log(res))
.catch(err => console.error(err))
这是Mysql.js
{ SQL_SOCKET, SQL_USER, SQL_PASSWORD, SQL_DATABASE } = process.env
const db = mysql.createConnection({
socketPath: SQL_SOCKET,
user: SQL_USER,
password: SQL_PASSWORD,
database: SQL_DATABASE,
charset: 'utf8mb4',
})
module.exports = db
答案 0 :(得分:0)
我记得几年前当我在expressJS
应用程序中尝试使用mysql模块并尝试使用async/await
时遇到了这个问题。错误也可能来自查询发生致命错误的连接,请参见here。因此,最佳做法要求您在查询中打开连接,启动查询事务,提交查询,然后再释放连接-允许您在发生错误时进行回滚。我看不到这个过程在这里发生,所以这有可能。
无论如何,我可以为您提供另一种选择,这是我最终使用的方法。基本上,我自己偏离了query()
,而让node handle it。
使用无事务查询的示例:
/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/routes/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;