Sails.js Redis如何stream数据?

我一直在寻找信息,知道如何连接Redis的Sails.js抛出模型 – 控制器 – 视图,我想我已经得到了它。

我的问题是,我认为我不了解Redis的理念,它的关键,等等。

我想我的Redis没有任何密钥,我的意思是这不是像“名称:维克多,姓:加西亚”,但“维克多:加西亚”,没有一个关键,所以我不知道如何设置属性的模型Redis的。

所以我试过了不设置属性,或者只设置一个属性(例如“Victor:Garcia:33:Seville:Spain”),但没有结果。

我的模型看起来像这样:

module.exports = { schema: false, connection: 'redis', autoPK: false, autoCreatedAt: false, autoUpdatedAt: false, attributes: { ta : 'string', // Override toJSON instance method toJSON: function() { var obj = this.toObject(); return obj; } } }; 

我试过这个:

 Redis.find() .where({ ta: 'MB:400V:TRAF004:EP:MvMoment' }) .exec(function(err, users) { // Do stuff here console.log("User: " + users + " - " + err); }); 

事实上,没有结果,我进入控制台:

 User: - null 

不pipe我在哪里设置。

我也试图做这样的事情:

模型

 module.exports = { schema: false, connection: 'redis', autoPK: false, autoCreatedAt: false, autoUpdatedAt: false }; 

没有属性,我试图在控制器

 Redis.find() .where({ ta: 'MB:400V:TRAF004:EP:MvMoment' }) .exec(function(err, users) { // Do stuff here console.log("User: " + users + " - " + err); }); 

看看谷歌我find了这个

http://sailsjs.org/#!/documentation/reference/waterline/models/stream.html

我试图在我的应用程序中做样本。

模型(Redis.js):

 module.exports = { schema: false, connection: 'redis', autoPK: false, autoCreatedAt: false, autoUpdatedAt: false }; 

控制器:

 estStream: function(req,res){ if (req.param('startStream') && req.isSocket){ var getSocket = req.socket; // Start the stream. Pipe it to sockets. Redis.stream().pipe(getSocket.emit); } else { res.view(); } 

视图:

 <script type="text/javascript"> window.onload = function startListening(){ socket.on('gotUser',function(data){ console.log(data+' has joined the party'); }); }; </script> <div class="addButton" onClick="socket.get('/monweb/testStream/',{startStream:true})">Stream all the Users !</div> 

Bur当我点击button时,控制台的结果如下:

 error: Sending 500 ("Server Error") response: TypeError: Object function (ev) { if (ev == 'newListener') { return this.$emit.apply(this, arguments); } var args = util.toArray(arguments).slice(1) , lastArg = args[args.length - 1] , packet = { type: 'event' , name: ev }; if ('function' == typeof lastArg) { packet.id = ++this.ackPackets; packet.ack = lastArg.length ? 'data' : true; this.acks[packet.id] = lastArg; args = args.slice(0, args.length - 1); } packet.args = args; return this.packet(packet); } has no method 'on' at Stream.pipe (stream.js:65:8) at module.exports.testStream (/home/victor/gestamp-PRUEBAS/api/controllers/MonWebController.js:1364:24) at routeTargetFnWrapper (/home/victor/gestamp-PRUEBAS/node_modules/sails/lib/router/bind.js:178:5) at callbacks (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:164:37) at param (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:138:11) at param (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:135:11) at pass (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:145:5) at nextRoute (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:100:7) at callbacks (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:167:11) at /home/victor/gestamp-PRUEBAS/node_modules/sails/lib/router/bind.js:186:7 at alwaysAllow (/home/victor/gestamp-PRUEBAS/node_modules/sails/lib/hooks/policies/index.js:209:11) at routeTargetFnWrapper (/home/victor/gestamp-PRUEBAS/node_modules/sails/lib/router/bind.js:178:5) at callbacks (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:164:37) at param (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:138:11) at param (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:135:11) at pass (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/express/lib/router/index.js:145:5) [TypeError: Object function (ev) { if (ev == 'newListener') { return this.$emit.apply(this, arguments); } var args = util.toArray(arguments).slice(1) , lastArg = args[args.length - 1] , packet = { type: 'event' , name: ev }; if ('function' == typeof lastArg) { packet.id = ++this.ackPackets; packet.ack = lastArg.length ? 'data' : true; this.acks[packet.id] = lastArg; args = args.slice(0, args.length - 1); } packet.args = args; return this.packet(packet); } has no method 'on'] events.js:74 throw TypeError('Uncaught, unspecified "error" event.'); ^ TypeError: Uncaught, unspecified "error" event. at TypeError (<anonymous>) at emit (events.js:74:15) at ModelStream.end (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/waterline/lib/waterline/utils/stream.js:61:10) at module.exports.stream (/home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/waterline/lib/waterline/adapter/stream.js:25:66) at /home/victor/gestamp-PRUEBAS/node_modules/sails/node_modules/waterline/lib/waterline/query/stream.js:42:20 at process._tickDomainCallback (node.js:492:13) 

对不起,我知道我是新来的,我确信我正在做一些事情(或许多事情)是错误的,你能帮我吗? 所有我想要的是从Redisstream数据视图。 我希望看到Redis的每一个变化。

谢谢你们。

你有几个问题,所以让我们试着逐一回答:

Redis架构格式

Redis支持几种数据结构 ,其中sails-redis使用索引设置和二进制string来存储数据。 如果部分数据可用作主键,则可以提高系统性能(如果不使用sail),则自动根据序列生成主键。

根据你的定义,看起来你的模式应该是这样的:

 module.exports = { connection: 'your redis connection name' attributes: { ta : { type: 'string' } } } 

开始使用它可以通过创build一个空的控制器来使用蓝图API 。

检索数据

要从redis获取数据,您可以使用蓝图api通过生成的id获取数据,或者可以使用find方法创build一个新的控制器,这是一个示例(对于简单地调用模型Data,抱歉):

 module.exports = { findByTa: function (req, res) { Data.find({ where: { ta: req.param('ta') }}).exec(function (err, result) { res.json(result); }); } 

}

你还需要在conf / routes.js中为新的控制器函数添加一个路由

 'GET /data/ta/:ta': 'DataController.findByTa', 

stream数据

目前尚未对sails-redis实现stream方法,这就是出现错误的原因。

有关数据更改的通知

要获取有关数据更改的通知,您需要注册该模型的套接字以接收新实例,并接收模型实例(logging)以接收更新和删除事件,这是一个样本控制器,它在模型本身和订阅者实例。

 testEvents: function (req, res) { if (req.isSocket){ Data.watch(req); //register on the model Data.find({}).exec(function (err, result) { Data.subscribe(req.socket, result); // subscribe to model instance }); } } 

应为行动定义路线:

 'GET /data/testEvents': 'DataController.testEvents' 

在客户端,你应该添加一些代码来调用控制器并监听事件:

 window.onload = function startListening(){ io.socket.on('data',function(msg){ console.log(msg); }); io.socket.get('/data/testEvents'); };