经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MS SQL Server » 查看文章
Nodejs 操作 Sql Server
来源:cnblogs  作者:WeihanLi  时间:2018/11/25 19:53:01  对本文有异议

Nodejs 操作 Sql Server

Intro

最近项目需要爬取一些数据,数据有加密,前端的js又被混淆了,ajax请求被 hook 了,有些复杂,最后打算使用 puppeteer 来爬取数据。

Puppeteer 是谷歌团队在维护的一个项目,初衷主要是用来做网页的自动化测试, Google Chrome 团队官方的无界面(Headless)Chrome 工具,它是一个 Node 库,提供了一个高级的 API 来控制 DevTools协议上的无头版 Chrome ,也可以配置为使用完整(非无头)的 Chrome。这里就不详细介绍了,有兴趣的可以自己先行 Google 一下,之后再写一篇文章来介绍,今天主要介绍 node 操作 mssql。

node-mssql

node-mssql 是我们用来操作 Ms Sql Server 数据库用到的 npm 包,支持 promise, async/await 语法。这个包也是微软官方推荐使用的。

个人比较喜欢 async/await 语法。

基本用法:

  1. let pool = await sql.connect(config);
  2. // sql
  3. let result1 = await pool.request()
  4. .input('input_parameter', sql.Int, value)
  5. .query('select * from mytable where id = @input_parameter');
  6. // 存储过程
  7. let result2 = await pool.request()
  8. .input('input_parameter', sql.Int, value)
  9. .output('output_parameter', sql.VarChar(50))
  10. .execute('procedure_name');

更多用法请参考官方文档介绍 https://www.npmjs.com/package/mssql

封装

虽然提供比较完善的方法,但是如果用起来的话还是会觉得用起来有些不舒服,没有那么流畅,没有那么简洁,于是想自己封装一层

  1. const mssql = require("mssql");
  2. const log4js = require("log4js");
  3. const logger = log4js.getLogger("dbUtil");
  4. const connConfig = {
  5. user: "db user",
  6. password: "password",
  7. server: "server",
  8. database: "database name",
  9. connectionTimeout: 120000,
  10. requestTimeout: 3000000,
  11. retryTimes: 3,
  12. options: {
  13. encrypt: true
  14. },
  15. pool: {
  16. max: 1024,
  17. min: 1,
  18. idleTimeoutMillis: 30000
  19. }
  20. };
  21. mssql.on('error', err => {
  22. // ... error handler
  23. logger.error(err);
  24. });
  25. let connectionPool;
  26. var getConnection = async function(){//连接数据库
  27. if(!(connectionPool && connectionPool.connected)) {
  28. connectionPool = await mssql.connect(connConfig);
  29. }
  30. return connectionPool;
  31. }
  32. var querySql = async function (sql, params) {//写sql语句自由查询
  33. await mssql.close();// close
  34. var pool = await getConnection();
  35. var request = pool.request();
  36. if (params) {
  37. for (var index in params) {
  38. if (typeof params[index] == "number") {
  39. request.input(index, mssql.Int, params[index]);
  40. } else if (typeof params[index] == "string") {
  41. request.input(index, mssql.NVarChar, params[index]);
  42. }
  43. }
  44. }
  45. var result = await request.query(sql);
  46. await mssql.close();// close
  47. return result;
  48. };
  49. var add = async function (addObj, tableName) {//添加数据
  50. if(!addObj){
  51. return;
  52. }
  53. await mssql.close();// close
  54. var connection = await getConnection();
  55. var request = connection.request();
  56. var sql = "insert into " + tableName + "(";
  57. for (var index in addObj) {
  58. if (typeof addObj[index] == "number") {
  59. request.input(index, mssql.Int, addObj[index]);
  60. } else if (typeof addObj[index] == "string") {
  61. request.input(index, mssql.NVarChar, addObj[index]);
  62. }
  63. sql += index + ",";
  64. }
  65. sql = sql.substring(0, sql.length - 1) + ") values(";
  66. for (var index in addObj) {
  67. if (typeof addObj[index] == "number") {
  68. sql += "@" + index + ",";
  69. } else if (typeof addObj[index] == "string") {
  70. sql += "@" + index + ",";
  71. }
  72. }
  73. sql = sql.substring(0, sql.length - 1) + ")";
  74. var result = await request.query(sql);
  75. await mssql.close();// close
  76. return result;
  77. };
  78. var addIfNotExist = async function (addObj, whereObj, tableName) {//添加数据
  79. if(!addObj){
  80. return;
  81. }
  82. if(!whereObj){
  83. return await add(addObj, tableName);
  84. }
  85. await mssql.close();// close
  86. var connection = await getConnection();
  87. var request = connection.request();
  88. let sql = `BEGIN
  89. IF NOT EXISTS (SELECT 1 FROM ${tableName} WHERE 1 > 0`;
  90. for(var index in whereObj){
  91. if (typeof addObj[index] == "number") {
  92. request.input(index+'Where', mssql.Int, whereObj[index]);
  93. } else if (typeof addObj[index] == "string") {
  94. request.input(index+'Where', mssql.NVarChar, whereObj[index]);
  95. }
  96. sql += ` AND ${index} = @${index}Where`
  97. }
  98. sql+= ')';
  99. sql += 'BEGIN ';
  100. sql += "INSERT INTO " + tableName + "(";
  101. for (var index in addObj) {
  102. if (typeof addObj[index] == "number") {
  103. request.input(index, mssql.Int, addObj[index]);
  104. } else if (typeof addObj[index] == "string") {
  105. request.input(index, mssql.NVarChar, addObj[index]);
  106. }
  107. sql += index + ",";
  108. }
  109. sql = sql.substring(0, sql.length - 1) + ") values(";
  110. for (var index in addObj) {
  111. if (typeof addObj[index] == "number") {
  112. sql += "@" + index + ",";
  113. } else if (typeof addObj[index] == "string") {
  114. sql += "@" + index + ",";
  115. }
  116. }
  117. sql = sql.substring(0, sql.length - 1) + ")";
  118. sql += ` END
  119. END`;
  120. var result = await request.query(sql);
  121. await mssql.close();// close
  122. return result;
  123. };
  124. var addList = async function (addObjs, tableName) {//添加数据
  125. if(!addObjs || addObjs.length == 0){
  126. return;
  127. }
  128. await mssql.close();// close
  129. var connection = await getConnection();
  130. var sql = "INSERT INTO " + tableName + "(";
  131. if (addObjs) {
  132. let addObj = addObjs[0];
  133. for (var index in addObj) {
  134. sql += index + ",";
  135. }
  136. sql = sql.substring(0, sql.length - 1) + ") VALUES";
  137. addObjs.forEach(addObj => {
  138. sql = sql + "(";
  139. for (var index in addObj) {
  140. if (typeof addObj[index] == "number") {
  141. sql += addObj[index] + ",";
  142. } else if (typeof addObj[index] == "string") {
  143. sql += "N'" + addObj[index] + "'" + ",";
  144. }
  145. }
  146. sql = sql.substring(0, sql.length - 1) + "),";
  147. });
  148. }
  149. sql = sql.substring(0, sql.length - 1);
  150. // logger.info(sql);
  151. var result = await connection.request().query(sql);
  152. await mssql.close();// close
  153. return result;
  154. };
  155. var update = async function (updateObj, whereObj, tableName) {//更新数据
  156. await mssql.close();// close
  157. var connection = await getConnection();
  158. var request = connection.request();
  159. var sql = "UPDATE " + tableName + " SET ";
  160. if (updateObj) {
  161. for (var index in updateObj) {
  162. if (typeof updateObj[index] == "number") {
  163. request.input(index, mssql.Int, updateObj[index]);
  164. sql += index + "=@" + index + ",";
  165. } else if (typeof updateObj[index] == "string") {
  166. request.input(index, mssql.NVarChar, updateObj[index]);
  167. sql += index + "=@" + index + ",";
  168. }
  169. }
  170. }
  171. sql = sql.substring(0, sql.length - 1) + " WHERE ";
  172. if (whereObj) {
  173. for (var index in whereObj) {
  174. if (typeof whereObj[index] == "number") {
  175. request.input(index, mssql.Int, whereObj[index]);
  176. sql += index + "=@" + index + " AND ";
  177. } else if (typeof whereObj[index] == "string") {
  178. request.input(index, mssql.NVarChar, whereObj[index]);
  179. sql += index + "=@" + index + " AND ";
  180. }
  181. }
  182. }
  183. sql = sql.substring(0, sql.length - 5);
  184. var result = await request.query(sql);
  185. await mssql.close();// close
  186. return result;
  187. };
  188. exports.query = querySql;
  189. exports.update = update;
  190. exports.add = add;
  191. exports.addIfNotExist = addIfNotExist;
  192. exports.addList = addList;

Contact

Contact me: weihanli@outlook.com

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号