server2.js 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. /*
  2. * @Author: Dongge
  3. * @Date: 2019-05-16 10:35:38
  4. * @LastEditTime: 2019-05-24 09:56:04
  5. * @Description: server for front-end,mock--getfpdjson V1.0
  6. */
  7. // 经过和node-oracle 模块作者的讨论,合理配置了连接池参数,poolMax:连接池最大保持连接数,需要小于128,poolMin:连接池最小存活连接,poolPingInterval:探活时间,poolTimeout:连接被销毁时间,0为永远不销毁,针对个人开发测试,推荐永远不销毁。--20190520
  8. // 同步和异步ajax测试均通过,模拟原始getresult接口的datasorce成功,增加数据库信息配置文件datasource.ini,增加读取配置文件功能 --20150523
  9. // 编写批处理启动server.cmd,整合运行环境:nodejs包,oracle客户端包instantclient_11_2,发布版V1.0 --20150524
  10. var http = require('http');
  11. var oracledb = require("oracledb");
  12. var fs = require("fs");
  13. var readline = require("readline");
  14. var path = require('path')
  15. var querystring = require('querystring')
  16. oracledb.poolMax = 100;
  17. oracledb.poolMin = 1;
  18. oracledb.poolPingInterval = 20;
  19. oracledb.poolTimeout = 0;
  20. process
  21. .once('SIGTERM', closePoolAndExit)
  22. .once('SIGINT', closePoolAndExit);
  23. // readFile 读取文件函数,返回promise
  24. var readFile = async function (path) {
  25. var rl = readline.createInterface({
  26. input: fs.createReadStream(path).setEncoding('utf8')
  27. });
  28. return new Promise((resolve, reject) => {
  29. var array = [];
  30. rl.on("line", line => {
  31. array.push(line);
  32. });
  33. rl.on("close", () => {
  34. resolve(array);
  35. });
  36. });
  37. };
  38. // 初始化连接池
  39. var pool = {};
  40. var initPool = async function () {
  41. // var dbconfig = await readFile('./datasource.ini');
  42. // for (var i = 0; i < dbconfig.length; i++) {
  43. // var temp = dbconfig[i].split(',');
  44. try {
  45. await oracledb.createPool({
  46. _enableStats: true,
  47. user: "HLWYY",
  48. password: 'Xmykzxhlwyy963', // mypw contains the hr schema password
  49. connectString: "10.10.10.16:1521/rac",
  50. poolAlias: "im"
  51. });
  52. pool["im"] = true;
  53. } catch (err) {
  54. pool["im"] = false;
  55. console.error(err.message);
  56. throw new Error('连接池"im"创建失败!");
  57. }
  58. // }
  59. }
  60. //退出执行函数
  61. async function closePoolAndExit() {
  62. console.log("\nTerminating");
  63. try {
  64. for(var key in pool){
  65. await oracledb.getPool(key).close(10);
  66. }
  67. process.exit(0);
  68. } catch (err) {
  69. console.error(err.message);
  70. process.exit(1);
  71. }
  72. }
  73. //查询函数
  74. var executeSql = async function (dataSource, sql) {
  75. var pool_flag = pool[dataSource];
  76. if (!pool_flag) {
  77. return
  78. }
  79. var pool_name = oracledb.getPool(dataSource);
  80. try {
  81. var connection = await pool_name.getConnection();
  82. let result = await connection.execute(sql);
  83. await connection.close();
  84. return Promise.resolve(result);
  85. } catch (err) {
  86. console.log(err.message)
  87. }
  88. };
  89. (async () => {
  90. await initPool();
  91. //启动服务器
  92. var server = http.createServer((req, res) => {
  93. if (req.url === "/getResult") {
  94. // 跨域,null是开启本地直接访问服务器特权
  95. res.setHeader('Access-Control-Allow-Origin', 'null');
  96. var params = '';
  97. req.setEncoding('utf8');
  98. // 采用post请求,接收前端的参数,这里考虑到sql里面可能有汉字,所以前端传过来的是编码后的JSON字符串。
  99. req.on('data', function (chunk) {
  100. params += chunk;
  101. });
  102. req.on('end', () => {
  103. params = decodeURIComponent(unescape(params));
  104. var { sql, dataSource } = JSON.parse(params);
  105. (async () => {
  106. try {
  107. var { metaData, rows } = await executeSql(dataSource, sql);
  108. var data = [];
  109. for (var i = 0; i < rows.length; i++) {
  110. var temp = {}
  111. for (var j = 0; j < metaData.length; j++) {
  112. temp[metaData[j]['name']] = rows[i][j];
  113. }
  114. data.push(temp);
  115. }
  116. var dataReturn = { flag: 1, data: data }
  117. res.end(JSON.stringify(dataReturn));
  118. } catch (err) {
  119. res.end(JSON.stringify({ flag: 0, data: err.message }));
  120. }
  121. })();
  122. })
  123. } else if (req.url === "/getlog") {
  124. //查看连接池状态信息接口,暂时写死了别名,调试用的,需要换成你自己的别名。
  125. oracledb.getPool('J1_SGS')._logStats();
  126. res.end();
  127. }
  128. })
  129. }