簡體   English   中英

通過Node.JS / NPM的MySQL庫在查詢中使用承諾

[英]Using Promises with Queries with Node.JS/NPM's MySQL Library

我正在將mysql NPM庫與Node.JS結合使用,並且試圖查詢數據庫並讓該函數返回Promise,而不需要回調。 這是我嘗試過的:

index.js:

var result = await asyncQuery.main(connection, "SELECT * FROM tbl WHERE id = ?", "1234567890")

asyncQuery.js:

var colors = require('colors')

module.exports = {
  main: function(con, q, vars) {
    return new Promise((resolve, reject) => {
      if (!vars) {
        con.query(q, function (err, result) {
          if (err) {
            console.log(colors.red(err.stack))

            return reject(err);
          }
          resolve(result)
        })
      }
      else {
        con.query(q, vars, function (err, result) {
          if (err) {
            console.log(colors.red(err.stack))

            return reject(err);
          }
          resolve(result)
        })
      }
    })
  }
}

如果沒有傳遞vars / args( ? ),但是一次傳遞了一個? ,這可以正常工作? 使用時,出現錯誤:

Error: ER_PARSE_ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1

如果我要運行帶有回調的常規查詢,則可以很好地工作。 asyncQuery.js ,但是我不確定是什么問題。

是否有人對此代碼有修復,或者是實現我的目標的更簡單方法? 我聽說過Promise MySQL庫 ,但不確定它是否支持Promise 回調查詢。 如果是這樣,請告訴我,我會試一試。

NodeJS版本:9.1.0

NPM版本:5.5.1

NPM的MySQL庫版本:2.15.0

該確切的查詢有效並且不會觸發該錯誤,您可能有一個帶有多個占位符的更復雜的查詢,例如:

SELECT * FROM tbl WHERE id = ? or ref_id = ?

在這種情況下,您將需要發送一個與?一樣多的值的數組,而不是發送一個字符串? 你有。

因此,只需發送: ["1234567890", "1234567890"]而不是上述查詢的字符串。

此外,您的方法可以簡化為:

module.exports = {
    main(con, q, vars) {
        return new Promise((resolve, reject) => {
            con.query(q, vars, function(err, result) {
                if (err) {
                    console.log(colors.red(err.stack))

                    return reject(err);
                }
                resolve(result)
            })
        })
    }
}

允許您刪除if/else

作為個人說明,我更喜歡mysql2軟件包,該軟件包已經有一個promise包裝器,並且比mysql快,並且具有幾乎相同的API的好處。

您可以使用npmjs中的mysql-promise軟件包,它的作用就像是mysql和mysql2的包裝: https ://www.npmjs.com/package/mysql-promise

用法示例:

var db = require('mysql-promise')();

db.configure({
    "host": "localhost",
    "user": "foo",
    "password": "bar",
    "database": "db"
});

db.query('UPDATE foo SET key = ?', ['value'])
.then( function(){ return db.query('SELECT * FROM foo'); })
.spread(function (rows) { console.log('Loook at all the foo', rows); });

暫無
暫無

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

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