node.js:怎樣同時執行多條SQLs,且只有一個回調


異步處理

本文主要介紹開源node.js庫mysql-queries,其可以同時執行多條SQLs,且只有一個回調。同時拋磚引玉,與大家交流node.js開發經驗。

node.js很大的特點就是事件驅動、非阻塞和異步執行,很多地方都需要回調處理。在一些復雜業務中,會出現由於回調處理引起的代碼多層嵌套,其可讀性和感觀,對一些開發者來說,顯得不適應,甚至惡心。 從而引起口水戰, 甚至於否定node.js。多層嵌套的代碼組織方式,顯然是不可取的, 但並不是說事件驅動、非阻塞、異步執行和回調處理等不好,這些恰恰是編程的核心思想,在編碼上對開發者有一定的要求和約束,需要對業務開發進行分析解耦,從而更好的組織代碼讓其看起來更加簡練。所以,觀念上需要改變和適應。言歸正傳,下面聊一聊mysql-queries。

顧名思義,mysql-queries就是為mysql簡單地執行多條SQLs的node.js庫。其特點在於無需多層嵌套,且只有一個回調,從而使代碼更加簡潔。下面通過實例演示一下,比較傳統的方式和mysql-queries在編碼上的差異。

實例

例如同時執行下面三條SQLs:

var sqls = ['SELECT * FROM prod_unit WHERE NAME=? limit 1',
  'INSERT INTO prod_unit(name) values(?)',
  'INSERT INTO product(name, unit_id, price) VALUES(?, ?, ?)'];
  • 傳統的做法
  var mysql = require('mysql'),
      conf = {
        host: 'localhost',
        user: 'nodejs',
        password: 'nodejs',
        database: 'nodejs',
        port: 3306
      },
      conn = mysql.createConnection(conf);
  conn.connect();
  conn.query(sqls[0], [params.unit_name], function (err0, res0) {
    if (err0) {
      console.log(err0);
    } else {
      conn.query(sqls[1], [params.unit_name], function (err1, res1) {
        if (err1) {
          console.log(err1);
        } else {
          conn.query(sqls[2], [params.name,params.type_id,params.unit_id,params.price], function (err2, res2) {
            if (err2) {
              console.log(err2);
            } else {
              //TODO something
            }
          });
        }
      });
    }
  });
  • 使用mysql-queries
    //實際使用中可以在應用啟動時進行初始化(只需執行一次)
    require('mysql-queries').init(conf);
    //執行多條SQLs
    var mq = require('mysql-queries');
    mq.queries(sqls,
      [[params.unit_name],[params.unit_name],[params.name,params.type_id,params.unit_id,params.price]], function(err, results){
      if(err) {
        console.log(err);
      } else {
        //"results"為數組,其為多條SQL的執行結果.
        console.log(results);
      }
    });

進階用法--根據前面SQL的執行結果,判斷是否執行當前SQL

例如上述SQLs,在新增商品時允許自定義單位,如果單位不存在,新建商品單位。否則,直接新增商品。

    mq.queries(sqls,
      [[params.unit_name],[params.unit_name],[params.name,params.type_id,params.unit_id,params.price]], {
      skip:function(i, arg, results) {//skip判斷是否忽略當前SQL的執行,返回true忽略,false不忽略
        var skip = false;
        //i為SQLs的索引號
        switch(i) {
          case 1:
          //根據第1條SQL的結果,判斷是否忽略執行第2條SQL
          skip = results[0].length!==0;
          break;
        case 2:
          //如果第二條被執行,其結果中的"insertId"將作為第3條SQL的參數
          if(results[0].length===0) {
            arg[2]=results[1].insertId;
          }
          break;
        }
        return skip;
      }
    }, function(err, results){
      if(err) {
        console.log(err);
      } else {
        //"results"為數組,其為多條SQL的執行結果.
        console.log(results);
      }
    });

另外

mysql-queries除了上述對代碼的簡化外, 其還采用了數據源和事務處理, 從而提高了開發效率和實用性,給數據庫操作帶來了很大的便利。

最后

本文除了介紹mysql-queries, 希望可以拋磚引玉, 從另一個角度看待node.js開發. 通過類似的方式對異步操作進行處理, 實現例如oracle-queries, ajax-queries等等, 也即此跟大家交流node.js開發心得.
更多內容,源碼和加星訪問:
https://github.com/zzzhan/nodejs-mysql-queries


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM