我是靠谱客的博主 称心凉面,最近开发中收集的这篇文章主要介绍开源分布式量化交易系统——NodeJs篇,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

NodeJs篇

上面已经对NodeJs这部分的项目结构做了介绍,现在我们就细细解剖下内部的细节,帮助大家了解我们利用Node需要完成什么任务,在整个量化项目中起到什么作用。

npm install express -g
npm install express-generator -g
express NodeJs

包资源

虽然通过express进行构建项目,大部分的架构已经实现,但许多像mysql包、session包、jwt包等需要我们自行安装,下面介绍下我们用到的一些包,并且在项目中的应用。

npm install bluebird  --save
npm install co --save

很多程序员写惯了同步代码,一下子适应不了Node的异步编写方式,这两个库主要用于node中实现同步方式写代码,下面代码多会有很多地方用到co。

npm install mysql --save

通过上面命令安装mysql包,并且在models下创建mysqldb.js,用于与数据连接。

'use strict'
const mysql = require('mysql')
var mysqldb = {}
function connectDB() {
mysqldb.db = mysql.createConnection({
host: '127.0.0.1',
user: 'root',
password: '123456',
port: '3306',
database: 'quant',
multipleStatements: true
})
console.log("==========>>>>>mysql connect<<<<<<===========")
// 连接错误,2秒重试
mysqldb.db.connect(function (err) {
if (err) {
console.log('error when connecting to db:', err)
setTimeout(handleError, 2000)
} else {
console.log('mysql connect ok!')
}
})
mysqldb.db.on('error', function (err) {
console.log('db error', err)
// 如果是连接断开,自动重新连接
if (err.code == 'PROTOCOL_CONNECTION_LOST' || err.code == 'ECONNREFUSED') {
connectDB()
} else {
console.log(err)
}
})
}
connectDB()
module.exports = mysqldb

models下的Users.js用于从数据库读取用户的订单、资金、持仓、委托、成交、结算、策略等信息。同时也加了些授权认证。

npm install Buffer  --save
npm install jwt-simple  --save

在common下的util.js下添加了常用的获取Token,验证中间件等公共方法。

'use strict'
var jwt = require('jwt-simple')
var Buffer = require('Buffer')
const Msg = require('../common/Msg')
const secret = Buffer.from('epiquantsecret', 'hex')
// 获取Token
function GetJwtToken(userId) {
var payload = { Id: userId };
var token = jwt.encode(payload, secret)
return token
}
// 验证Token
function DoAuth(req, res, next) {
if (req.session.UserId) {
next()
} else {
var token = (req.body && req.body.access_token) || (req.query && req.query.access_token)
|| req.header['x-access-token']
if (token) {
try {
var decoded = jwt.decode(token, secret);
console.log(decoded)
// 此处可以对token信息进行验证和权限控制
next()
} catch (err) {
return next()
}
} else {
res.json(Msg.Err.NoAccess)
}
}
}
module.exports = { GetJwtToken, DoAuth }

在api文件夹下的user.js用于发布REST API接口,供客户端调用。

var express = require('express')
var router = express.Router()
var co = require('co')
const Users = require('../models/Users')
const Msg = require('../common/Msg')
const util = require('../common/util')
router.post('/login', function (req, res, next) {
if (req.session.UserId) {
res.json(Msg.Info.Success)
} else {
co(function* () {
if (req.body.userName && req.body.userPwd) {
let r1 = yield Users.Login(req.body.userName, req.body.userPwd)
req.session.regenerate(function (err) {
if (err) {
res.json(Msg.ServerError)
}
if (r1.status) {
req.session.UserId = r1.result.UserId;
}
res.json(r1)
})
}
}).catch(function (err) {
res.json(Msg.Error(err))
})
}
});
router.post('/logout', function (req, res, next) {
req.session.destroy(function (err) {
if (err) {
res.json(Msg.Error(err))
return
}
res.clearCookie(req.session.UserId)
req.session.UserId = null
res.redirect('/')
})
})
// 通过token验证的才能查阅用户信息
router.post('/user', util.DoAuth, function (req, res, next) {
co(function* () {
if (req.body.id) {
let user = yield Users.FindOne(req.body.id)
res.json(user)
}
}).catch(function (err) {
res.json(Msg.ServerError)
})
});
module.exports = router

routes和views下主要用于前端的信息页面、报表页面和信息更新等功能,并且web端的验证用session来处理,确保登录者才能查阅信息。

npm install express-session  --save
npm install session-file-store  --save
var express = require('express')
var router = express.Router()
var co = require('co')
const util = require('../common/util')
const Users = require('../models/Users')
const Msg = require('../common/Msg')
router.get('/', util.DoAuth, function (req, res, next) {
co(function* () {
if (req.session.UserId) {
let r1 = yield Users.FindOne(req.session.UserId)
res.render('user',{UserName:r1.result.UserName})
}
}).catch(function (err) {
res.json(Msg.Error(err))
})
})
module.exports = router
<!DOCTYPE html>
<html>
<head>
<title>Quant登录页</title>
<script type="text/javascript" src="https://cdn.bootcss.com/jquery/3.3.1/jquery.min.js"></script>
</head>
<body>
<div style="margin:0 auto;float:left;position: absolute;">
<h1>Quant登录页</h1>
<p><span>用户名:</span><input type="text" id="userName" /></p>
<p>
<span>密码:</span><input type="password" id="userPwd" />
</p>
<p><input type="text" id="token" /><input type="text" id="userId" /></p>
<p><button id="btnLogin">登录</button><button id="btnValid">验证</button></p>
</div>
<script>
$(function(){
$("#btnLogin").click(function() {
$.post("/api/user/login", {
userName: $('#userName').val(),
userPwd: $('#userPwd').val()
}, function(data, status){
console.log(data, status)
$('#token').val(data.result.token)
$('#userId').val(data.result.UserId)
})
})
$("#btnValid").click(function () {
$.post("/api/user/info", {
id: $('#userId').val(),
access_token: $('#token').val()
}, function (data, status) {
console.log(data, status)
})
})
})
</script>
</body>
</html>

到此,NodeJs这块的基础架构已经实现,后面会不断完善各种接口,以及各种前端页面,并同步发布到Github上。通过本章的介绍,希望对刚接触NodeJs的读者有初步了解,也能渐渐地喜欢上这么语言,确实非常方便,非常强大。

最后

以上就是称心凉面为你收集整理的开源分布式量化交易系统——NodeJs篇的全部内容,希望文章能够帮你解决开源分布式量化交易系统——NodeJs篇所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部