Я пытаюсь запросить MySQL как обещание, но продолжаю получать сообщение об ошибке «unhandledpromiserejection» - PullRequest
0 голосов
/ 23 сентября 2019

Помогите, пожалуйста, я пытаюсь развернуть свое приложение на App Engine / CloudSQL, но получаю:

"UnhandledPromiserejectWarning": не удается поставить в очередь после фатальной ошибки ..

Я пытаюсь запросить 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 голосов
/ 23 сентября 2019

Я помню эту проблему несколько лет назад, когда я пытался использовать модуль 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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...