zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    array_map()与array_shift()搭配使用 PK array_column()函数
    Educational Codeforces Round 8 D. Magic Numbers
    hdu 1171 Big Event in HDU
    hdu 2844 poj 1742 Coins
    hdu 3591 The trouble of Xiaoqian
    hdu 2079 选课时间
    hdu 2191 珍惜现在,感恩生活 多重背包入门题
    hdu 5429 Geometric Progression 高精度浮点数(java版本)
    【BZOJ】1002: [FJOI2007]轮状病毒 递推+高精度
    hdu::1002 A + B Problem II
  • 原文地址:https://www.cnblogs.com/airhome/p/nodejs-mysql-queries.html
Copyright © 2011-2022 走看看