仓没加错:Node.js+MongoDB替你管理投资仓位

有人说,控制仓位的水平,决定了你是一个炒股新手还是民间股神。这句话还真有几分道理。因为仓位管理是交易风险管理的基础,所以资产规模越大的交易员就越重视仓位的管理。

下面,我们花上15分钟,亲手使用Node.js和MongoDB来搭建一个Web服务,用来管理我们的投资仓位。这个服务需要为我们提供一个接口,用来查询和更新投资仓位记录。在数据库层面,我们选择MongoDB来存储所有的仓位记录。

基本架构

我们使用Node.js下的Express框架来搭建仓位管理服务。总体来看,整个服务包含了四个层面的组件:

  • 数据库层面: MongoDB用来存储仓位记录

  • 模型层面:实现JavaScript对象和数据之间的映射

  • 控制器层面:提供仓位记录的增删改查操作逻辑

  • 路由层面: 根据不同的客户请求来调用相应的逻辑

接下来,我们来看一看如何实现这四个层面的代码

完整的项目代码可以在实战课程【玩转MongoDB4.0 从入门到实践】中查看

连接到MongoDB数据库

我们使用Node.js下的mongoose来连接MongoDB数据库。

在简单的演示场景中,我们可以使用下面这样的URL来连接到单独运行的mongod进程:


mongodb://<user>:<pwd>@<host>:<port>/<database>

而在严肃的业务场景中,则可以使用这样的URL来连接到MongoDB复制集:


mongodb://<user>:<pwd>@<host1>:<port1>,<host2>:<port2>,<host3>:<port3>/<database>?replicaSet=<replset>

以下的代码就可以帮助我们连接到一个在本地docker容器上运行的mongod进程:


var mongoose = require('mongoose');

var mongoDB = 'mongodb://localhost:27017/demo';

mongoose.connect(mongoDB, {useNewUrlParser: true});

var db = mongoose.connection;

db.on('error', console.error.bind(console, 'MongoDB连接异常:'));

定义仓位记录对象与数据之间的映射

mongoose是一个对象数据模型库(ODM)。和关系型数据库所使用的对象关系映射库(ORM)类似,mongoose可以帮助我们简化开发代码,实现模型验证,并且降低应用代码和数据库方案之间的耦合度。

我们先来定义一下仓位记录对象所包含的信息:

  • 交易账号

  • 股票代码

  • 交易数量

  • 交易价格

实现这个仓位记录映射的代码非常直观:


var mongoose = require('mongoose');

var Schema = mongoose.Schema;

var PositionSchema = new Schema({

    account: {type: String, required: true},

    stock: {type: String, required: true},

    quantity: {type: Number, required: true},

    price: {type: Number, required: true}

});

module.exports = mongoose.model('Position', PositionSchema);

在控制器层面实现仓位记录操作逻辑

接下来,我们终于可以使用mongoose库来实现数据操作了。

让我们来实现存储一条新增仓位记录的逻辑。

首先,我们可以使用客户请求中的POST数据来创建一个仓位记录对象,然后使用mongoose来将这个对象映射存储进数据库中:


var Position = require('../models/position');

// Create

exports.createPosition = function(req, res) {

    var position = new Position(

        {

            account: req.body.account,

            stock: req.body.stock,

            quantity: req.body.quantity,

            price: req.body.price

        }

    );

    position.save(function (err) {

        if (err) {

            return next(err)

        }

        res.send('仓位记录添加成功')

    })

};

不仅要存储新的仓位记录,我们还需要从数据库中查询之前保存过的仓位记录。

比如说,我们需要一个可以通过交易账户来查找该账户下所有的仓位记录的服务。我们使用mongoose库中的find()函数来进行数据库查询:


// Read

exports.queryPosition = function(req, res) {

    Position.find({account: req.params.account}, function(err, position) {

        if (err) return next(err);

        res.send(position);

    })

};

这个find()函数的查询语句参数看起来很眼熟吧?是不是和mongo shell中的find()函数很相似呢?

使用路由来分配客户请求

现在,我们已经可以开始设计我们的Web服务的端点了。

很简单,如果客户发送一个POST请求到/create端点,存储仓位记录的逻辑应该被调用;而如果客户发送一个包含:account参数的GET请求时,查询仓位记录的逻辑则应该被调用:


var express = require('express');

var router = express.Router();

var positionController = require('../controllers/position');

router.post('/create', positionController.createPosition);

router.get('/:account', positionController.queryPosition);

组装服务

所有层面的实现都已经准备就绪了。让我们把所有逻辑组装在一起吧:


var express = require('express');

var app = express();

var position = require('./routes/position');

app.use('/position', position);

var port = 8888;

app.listen(port, () => {

    console.log('仓位记录管理服务运行中...')

});

怎么样?搭建这样一个支持MongoDB基本操作的Web服务是不是很简单呢?

想要查看完整的项目代码,或是观看手把手讲解的演示视频,请大家移步我们精心打造的100%好评实战课程【玩转MongoDB4.0 从入门到实践】

阅读愉快~

首发于https://www.imooc.com/article/283468,转载请注明

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351