我试图查询MySQL作为一个承诺,但我不断收到“ unhandledpromiserejection错误”

时间:2019-09-23 00:22:03

标签: google-app-engine unhandled-exception

请帮助我正在尝试将我的应用程序部署到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

1 个答案:

答案 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;