流程大致为:页面搜集要保存的棋子编号、颜色信息,通过JQuery的$.post方法提交,提交到服务器端通过express提供的地址,如http://localhost:8888/go/save,由服务器端的Node.js程序调用oracledb将数据保存。
打开棋谱流程:页面通过JQuery的$.get方法,调用服务(http://localhost:8888/go/load),服务端端对应的程序读取数据,返回JSON。装载的结果,我仅在控制台进行了输出,没有在棋谱上显示。技术上都走通了,实在懒得再完善了。
不知大家有没有这样的感觉,刚开始写程序时,觉得很好玩,写得很来劲儿,但到了后来,程序需要不停地完善、甚至有些要重写,兴趣就会逐渐消退。
遇到的问题列一列:
oracledb默认不自动提交,insert的数据看不到;
express需要body-parser插件才能读取post的数据
大致展示一下相关的代码。
一、程序入口文件app.js
// 引入模块 var express = require('express'); var bodyParser = require("body-parser") var path = require('path'); var ejs = require('ejs'); var goAction = require("./server/action/goAction") var app = express(); app.use(bodyParser.urlencoded({ extended: false })) app.use(bodyParser.json()) // 新增接口路由 app.get('/data/:module',function (req,res,next) { var c_path = req.params.module; var Action = require('./server/action/' + c_path); Action.execute(req,res); }); //处理棋谱保存的路由 app.get('/go/load',next) { goAction.load(req,res); }); //处理棋谱保存的路由 app.post('/go/save',next) { goAction.save(req,res); }); // 对所有(/)URL或路由返回index.html app.get('/',res) { console.log(req.url); res.render('index'); }); // 设置views路径和模板 app.set('views',path.join(__dirname,'dist')); app.set('view engine','html'); app.engine('html',ejs.renderFile); // app.use配置 app.use('/',express.static(path.join(__dirname,'dist'))); // 启动一个服务,监听从8888端口进入的所有连接请求 var server = app.listen(8888,function(){ var host = server.address().address; var port = server.address().port; });
二、数据辅助类DbUtil.js
建表语句如下:
create table t_pos( id varchar2(32) primary key,--GUID做主键 nums varchar2(1800),--分号分隔的棋子编号 colors varchar2(1800),--分号分隔的棋子颜色 record_date date default sysdate --记录时间 );
var oracledb = require('oracledb'); var dbConfig = require('./dbconfig'); oracledb.autoCommit = true; function doConnect(cb) { oracledb.getConnection( { user : dbConfig.user,password : dbConfig.password,connectString : dbConfig.connectString },cb); }; function doRelease(conn) { conn.release(function (err) { if (err) console.error(err.message); }); }; function doSelect(conn,sql,param,cb) { console.log('执行查询:sql='+sql+',param='+param); conn.execute( sql,// A bind variable parameter is needed to disambiguate the following options parameter // otherwise you will get Error: ORA-01036: illegal variable name/number { outFormat: oracledb.OBJECT },// outFormat can be OBJECT or ARRAY. The default is ARRAY function(err,result) { if (err) { return cb(err,conn); } else { console.log(result.rows); return cb(null,conn,result.rows); } }); }; function doUpdate(conn,cb) { console.log('sql='+sql+',function(err,conn); } else { console.log(result); return cb(null,result); } }); }; //这个没有试验 function doCommit(conn,cb){ conn.commit(); } function select(sql,callback){ var async = require('async'); async.waterfall([ doConnect,function(conn,cb) { cb(null,param); },doSelect ],result){ if (err) { console.error("In waterfall error cb: ==>",err,"<=="); } else if (callback){callback(result);} if (conn){ doRelease(conn);} }); }; function update(sql,doUpdate ],"<=="); } else if (callback){callback(result);} if (conn){ doRelease(conn);} }); }; function select_Test(){ select("select * from tab",{},function(result){ console.log(result); }); }; //保存位置 function savePosition(numColorArr,callback){ update("insert into t_pos (id,nums,colors) values (sys_guid(),:n,:c)",numColorArr,callback); } //装载位置信息 function loadPosition(callback){ select("select * from t_pos order by record_date desc ",callback); } module.exports.select = select; module.exports.update = update; module.exports.savePosition = savePosition; module.exports.loadPosition = loadPosition;
三、后台服务类goAction.js,响应页面请求
var dbUtil = require('../util/DbUtil'); //使用类来处理 class goAction{ constructor() { } save(req,res){ //读取post方式传递的位置数据 var nums = req.body.nums; var colors = req.body.colors; dbUtil.savePosition([nums,colors],function(result){ //简单返回影响行数。如果为1表示成功。 res.send(result); }); } load(req,res){ dbUtil.loadPosition(function(result){ //简单返回影响行数。如果为1表示成功。 res.send(result); }); } } module.exports = new goAction();