【问题标题】:MySQL not running with Promise.All in Node.jsMySQL 未在 Node.js 中使用 Promise.All 运行
【发布时间】:2020-06-19 18:58:30
【问题描述】:

MySQL 通过简单的回调运行良好,但我想在 express node.js 中异步运行多个 mysql 查询,因为我使用 async await 和 promise.all。我也尝试过使用 promise.allSettled,但它仍然给出了同样的错误。 这是完整的代码。

dbConn.js

var config = require('../config');
var conn = (module.exports = require("mysql").createConnection({
  host: config.dbHost,
  user: config.dbUser,
  port: config.dbPort,
  password: config.dbPassword,
  database: config.dbName,
}));

conn.connect(err => {
  if (err) {
    return console.log(err.stack);
  } else {
    return console.log("Connected!");
  }
});

路由文件。

var conn = require('../DB/dbConn');

router.get('/search',async  function(req, res, next) {

  try {

    const CourseContent = await conn.query( "SELECT cd.*,s.*,u.* from coursesdetails cd,subjects s,universities u where cd.subjectId = s.subjectId and u.universityId = cd.universityId and s.subjectNameEn like '%Art%';" );
    const Allsubjects = await conn.query("select * from subjects;");
    const AllCountries = await conn.query("SELECT distinct Country from worldcities;");       
    const AllDisciplines = await conn.query("select * from discipline;");

    const promises = [CourseContent,Allsubjects,AllCountries,AllDisciplines];

    Promise.all(promises).then((results) => {
        console.log(results);
        res.render('search', { results: results,layout: 'layouts/index-layout' });

    }).catch((error)=> {console.log(error);})


  } catch (error) {
    console.error(error);
  }



  });

来自 Promise.all 结果的响应

[
  Query {
    _events: [Object: null prototype] {
      error: [Function],
      packet: [Function],
      timeout: [Function],
      end: [Function]
    },
    _eventsCount: 4,
    _maxListeners: undefined,
    _callback: undefined,
    _callSite: Error
        at Protocol._enqueue (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\mysql\lib\protocol\Protocol.js:144:48)
        at Connection.query (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\mysql\lib\Connection.js:198:25)
        at C:\Users\myste\Documents\Office Work\FindCoursesNode.js\routes\course.js:58:38
        at Layer.handle [as handle_request] (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\express\lib\router\layer.js:95:5)
        at next (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\express\lib\router\route.js:137:13)
        at Route.dispatch (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\express\lib\router\route.js:112:3)
        at Layer.handle [as handle_request] (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\express\lib\router\layer.js:95:5)
        at C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\express\lib\router\index.js:281:22
        at Function.process_params (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\express\lib\router\index.js:335:12)
        at next (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\express\lib\router\index.js:275:10),
    _ended: false,
    _timeout: undefined,
    _timer: Timer { _object: [Circular], _timeout: null },
    sql: "SELECT cd.*,s.*,u.* from coursesdetails cd,subjects s,universities u where cd.subjectId = s.subjectId and u.universityId = cd.universityId and s.subjectNameEn like '%Art%';",
    values: undefined,
    typeCast: true,
    nestTables: false,
    _resultSet: null,
    _results: [],
    _fields: [],
    _index: 0,
    _loadError: null,
    _connection: Connection {
      _events: [Object: null prototype] {},
      _eventsCount: 0,
      _maxListeners: undefined,
      config: [ConnectionConfig],
      _socket: [Socket],
      _protocol: [Protocol],
      _connectCalled: true,
      state: 'authenticated',
      threadId: 25,
      [Symbol(kCapture)]: false
    },
    [Symbol(kCapture)]: false
  },
  Query {
    _events: [Object: null prototype] {
      error: [Function],
      packet: [Function],
      timeout: [Function],
      end: [Function]
    },
    _eventsCount: 4,
    _maxListeners: undefined,
    _callback: undefined,
    _callSite: Error
        at Protocol._enqueue (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\mysql\lib\protocol\Protocol.js:144:48)
        at Connection.query (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\mysql\lib\Connection.js:198:25)
        at C:\Users\myste\Documents\Office Work\FindCoursesNode.js\routes\course.js:59:36
        at processTicksAndRejections (internal/process/task_queues.js:97:5),
    _ended: false,
    _timeout: undefined,
    _timer: Timer { _object: [Circular], _timeout: null },
    sql: 'select * from subjects;',
    values: undefined,
    typeCast: true,
    nestTables: false,
    _resultSet: null,
    _results: [],
    _fields: [],
    _index: 0,
    _loadError: null,
    _connection: Connection {
      _events: [Object: null prototype] {},
      _eventsCount: 0,
      _maxListeners: undefined,
      config: [ConnectionConfig],
      _socket: [Socket],
      _protocol: [Protocol],
      _connectCalled: true,
      state: 'authenticated',
      threadId: 25,
      [Symbol(kCapture)]: false
    },
    [Symbol(kCapture)]: false
  },
  Query {
    _events: [Object: null prototype] {
      error: [Function],
      packet: [Function],
      timeout: [Function],
      end: [Function]
    },
    _eventsCount: 4,
    _maxListeners: undefined,
    _callback: undefined,
    _callSite: Error
        at Protocol._enqueue (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\mysql\lib\protocol\Protocol.js:144:48)
        at Connection.query (C:\Users\myste\Documents\Office Work\FindCoursesNode.js\node_modules\mysql\lib\Connection.js:198:25)
        at C:\Users\myste\Documents\Office Work\FindCoursesNode.js\routes\course.js:60:37
        at processTicksAndRejections (internal/process/task_queues.js:97:5),
    _ended: false,
    _timeout: undefined,
    _timer: Timer { _object: [Circular], _timeout: null },
    sql: 'SELECT distinct Country from worldcities;',
    values: undefined,
    typeCast: true,
    nestTables: false,
    _resultSet: null,
    _results: [],
    _fields: [],
    _index: 0,
    _loadError: null,
    _connection: Connection {
      _events: [Object: null prototype] {},
      _eventsCount: 0,
      _maxListeners: undefined,
      config: [ConnectionConfig],
      _socket: [Socket],
      _protocol: [Protocol],
      _connectCalled: true,
      state: 'authenticated',
      threadId: 25,
      [Symbol(kCapture)]: false
    },
    [Symbol(kCapture)]: false
  }...

Node.js 版本 12.18.1

【问题讨论】:

    标签: javascript mysql node.js express


    【解决方案1】:

    mysql 模块不支持Promise API,因此您不能将async/await 与它一起使用。如果你想使用async/await,那么你应该看看mysql2 模块。下面是一个使用这个模块的小例子:

    const mysql = require('mysql2');
    
    (async function main(param) {
        try {
            const nativePool = mysql.createPool({
                host: 'localhost',
                user: 'root',
                database: 'newsdb',
                connectionLimit: 10,
            });
    
            const pool = nativePool.promise();
    
            const query1 = pool.query('SELECT * FROM users');
            const query2 = pool.query('SELECT * FROM users');
            const query3 = pool.query('SELECT * FROM users');
    
            const results = await Promise.all([query1, query2, query3]);
    
            results.forEach(([rows, fields]) => console.log(rows));
        } catch (error) {
            console.error(error);
        }
    })();
    

    另外,在您的示例代码中,如果您想在Promise.all 中并行执行请求,则不需要在请求之前使用await。因为,使用await,您将等待每个请求完成。

    【讨论】:

      【解决方案2】:

      你可以让它与 Promises 一起工作,因为你只想导入 node 中已经存在的 util 模块

      代码是这样的

      const util = require('util')
      
      conn.query = util.promisify(conn.query)
      
      

      然后你导出conn

      但我建议你使用 Pool 而不是 conn 用于 mysql ,我展示的方法也适用于 Pool

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-01
        • 1970-01-01
        • 2018-12-02
        相关资源
        最近更新 更多