簡體   English   中英

MySQL 不與 Promise 一起運行。全部在 Node.js

[英]MySQL not running with Promise.All in Node.js

MySQL 通過簡單的回調運行良好,但我想在 express node.js 中異步運行多個 mysql 查詢,為此我將異步等待與 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

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 ,您將等待每個請求完成。

你可以讓它與 Promises 一起工作,因為你只需要導入節點中已經存在的 util 模塊

代碼會是這樣的

const util = require('util')

conn.query = util.promisify(conn.query)

然后在它之后導出conn

但我建議您對 mysql 使用 Pool 而不是 conn,我展示的方法也適用於 Pool

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM