123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*
- * @Author: Dongge
- * @Date: 2019-05-16 10:35:38
- * @LastEditTime: 2019-05-24 09:56:04
- * @Description: server for front-end,mock--getfpdjson V1.0
- */
- // 经过和node-oracle 模块作者的讨论,合理配置了连接池参数,poolMax:连接池最大保持连接数,需要小于128,poolMin:连接池最小存活连接,poolPingInterval:探活时间,poolTimeout:连接被销毁时间,0为永远不销毁,针对个人开发测试,推荐永远不销毁。--20190520
- // 同步和异步ajax测试均通过,模拟原始getresult接口的datasorce成功,增加数据库信息配置文件datasource.ini,增加读取配置文件功能 --20150523
- // 编写批处理启动server.cmd,整合运行环境:nodejs包,oracle客户端包instantclient_11_2,发布版V1.0 --20150524
- var http = require('http');
- var oracledb = require("oracledb");
- var fs = require("fs");
- var readline = require("readline");
- var path = require('path')
- var querystring = require('querystring')
- oracledb.poolMax = 100;
- oracledb.poolMin = 1;
- oracledb.poolPingInterval = 20;
- oracledb.poolTimeout = 0;
- process
- .once('SIGTERM', closePoolAndExit)
- .once('SIGINT', closePoolAndExit);
- // readFile 读取文件函数,返回promise
- var readFile = async function (path) {
- var rl = readline.createInterface({
- input: fs.createReadStream(path).setEncoding('utf8')
- });
- return new Promise((resolve, reject) => {
- var array = [];
- rl.on("line", line => {
- array.push(line);
- });
- rl.on("close", () => {
- resolve(array);
- });
- });
- };
- // 初始化连接池
- var pool = {};
- var initPool = async function () {
- // var dbconfig = await readFile('./datasource.ini');
- // for (var i = 0; i < dbconfig.length; i++) {
- // var temp = dbconfig[i].split(',');
- try {
- await oracledb.createPool({
- _enableStats: true,
- user: "HLWYY",
- password: 'Xmykzxhlwyy963', // mypw contains the hr schema password
- connectString: "10.10.10.16:1521/rac",
- poolAlias: "im"
- });
- pool["im"] = true;
- } catch (err) {
- pool["im"] = false;
- console.error(err.message);
- throw new Error('连接池"im"创建失败!");
- }
- // }
- }
- //退出执行函数
- async function closePoolAndExit() {
- console.log("\nTerminating");
- try {
- for(var key in pool){
- await oracledb.getPool(key).close(10);
- }
- process.exit(0);
- } catch (err) {
- console.error(err.message);
- process.exit(1);
- }
- }
- //查询函数
- var executeSql = async function (dataSource, sql) {
- var pool_flag = pool[dataSource];
- if (!pool_flag) {
- return
- }
- var pool_name = oracledb.getPool(dataSource);
- try {
- var connection = await pool_name.getConnection();
- let result = await connection.execute(sql);
- await connection.close();
- return Promise.resolve(result);
- } catch (err) {
- console.log(err.message)
- }
- };
- (async () => {
- await initPool();
- //启动服务器
- var server = http.createServer((req, res) => {
- if (req.url === "/getResult") {
- // 跨域,null是开启本地直接访问服务器特权
- res.setHeader('Access-Control-Allow-Origin', 'null');
- var params = '';
- req.setEncoding('utf8');
- // 采用post请求,接收前端的参数,这里考虑到sql里面可能有汉字,所以前端传过来的是编码后的JSON字符串。
- req.on('data', function (chunk) {
- params += chunk;
- });
- req.on('end', () => {
- params = decodeURIComponent(unescape(params));
- var { sql, dataSource } = JSON.parse(params);
- (async () => {
- try {
- var { metaData, rows } = await executeSql(dataSource, sql);
- var data = [];
- for (var i = 0; i < rows.length; i++) {
- var temp = {}
- for (var j = 0; j < metaData.length; j++) {
- temp[metaData[j]['name']] = rows[i][j];
- }
- data.push(temp);
- }
- var dataReturn = { flag: 1, data: data }
- res.end(JSON.stringify(dataReturn));
- } catch (err) {
- res.end(JSON.stringify({ flag: 0, data: err.message }));
- }
- })();
- })
- } else if (req.url === "/getlog") {
- //查看连接池状态信息接口,暂时写死了别名,调试用的,需要换成你自己的别名。
- oracledb.getPool('J1_SGS')._logStats();
- res.end();
- }
- })
- }
|