Vic*_*cia 5 redis node.js sails.js waterline
我一直在寻找信息知道如何将Redis连接到Sails.js抛出模型 - 控制器 - 视图,我想我已经得到了它.
我的问题是,我认为我不理解Redis的哲学,它的键等.
我猜我的Redis没有任何钥匙,我的意思是它不是"名字:Victor,姓:Garcia"而是"Victor:García",没有钥匙,所以我不知道如何在模型中设置属性Redis的.
所以我尝试了没有设置属性或只设置整个键的属性(例如"Victor:Garcia:33:塞维利亚:西班牙"),但没有结果.
我的模型看起来像这样:
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;
}
}
};
Run Code Online (Sandbox Code Playgroud)
我试过这个:
Redis.find()
.where({ ta: 'MB:400V:TRAF004:EP:MvMoment' })
.exec(function(err, users) {
// Do stuff here
console.log("User: " + users + " - " + err);
});
Run Code Online (Sandbox Code Playgroud)
事实上,没有结果,我进入控制台:
User: - null
Run Code Online (Sandbox Code Playgroud)
不管我在哪里.
我也试过做这样的事情:
模型
module.exports = {
schema: false,
connection: 'redis',
autoPK: false,
autoCreatedAt: false,
autoUpdatedAt: false
};
Run Code Online (Sandbox Code Playgroud)
没有属性,我在控制器中尝试过
Redis.find()
.where({ ta: 'MB:400V:TRAF004:EP:MvMoment' })
.exec(function(err, users) {
// Do stuff here
console.log("User: " + users + " - " + err);
});
Run Code Online (Sandbox Code Playgroud)
看看谷歌我发现了这个
http://sailsjs.org/#!/documentation/reference/waterline/models/stream.html
我试着在我的应用程序中做样本.
型号(Redis.js):
module.exports = {
schema: false,
connection: 'redis',
autoPK: false,
autoCreatedAt: false,
autoUpdatedAt: false
};
Run Code Online (Sandbox Code Playgroud)
控制器:
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();
}
Run Code Online (Sandbox Code Playgroud)
视图:
<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>
Run Code Online (Sandbox Code Playgroud)
当我点击按钮时,按控制台的结果如下:
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)
Run Code Online (Sandbox Code Playgroud)
对不起,我知道我是新手,我确信我做错了什么(或很多事情),你能帮助我吗?我想要的只是将数据从Redis传输到View.我想在视图中看到Redis的每一个变化.
谢谢你们.
您提出了几个问题,让我们尝试一一回答:
Redis 支持多种数据结构,其中 sails-redis 使用 set 作为索引,使用二进制字符串来存储数据。如果一部分数据可以用作主键,那么使用它可以提高系统性能,如果不是, sails-redis 会根据序列自动生成主键。
根据您的定义,您的架构应该如下所示:
module.exports = {
connection: 'your redis connection name'
attributes: {
ta : { type: 'string' }
}
}
Run Code Online (Sandbox Code Playgroud)
要开始使用它,您可以通过创建一个空控制器来使用蓝图 api。
要从 Redis 获取数据,您可以使用 blueprints api 通过生成的 id 获取数据,或者您可以使用 find 方法创建一个新的控制器,这是一个示例(抱歉,我们只是简单地调用模型 Data):
module.exports = {
findByTa: function (req, res) {
Data.find({ where: { ta: req.param('ta') }}).exec(function (err, result) {
res.json(result);
});
}
Run Code Online (Sandbox Code Playgroud)
}
您还需要在 conf/routes.js 中为新控制器功能添加路由
'GET /data/ta/:ta': 'DataController.findByTa',
Run Code Online (Sandbox Code Playgroud)
目前 sails-redis 尚未实现 Stream 方法,这就是您收到错误的原因。
要获取有关数据更改的通知,您需要为模型注册套接字以接收新实例,并为模型实例(记录)注册接收更新和删除事件,这是一个示例控制器,它在模型本身和所有现有的订阅者上注册实例。
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
});
}
}
Run Code Online (Sandbox Code Playgroud)
应为该操作定义一条路线:
'GET /data/testEvents': 'DataController.testEvents'
Run Code Online (Sandbox Code Playgroud)
在客户端,您应该添加一些代码来调用控制器并侦听事件:
window.onload = function startListening(){
io.socket.on('data',function(msg){
console.log(msg);
});
io.socket.get('/data/testEvents');
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2306 次 |
| 最近记录: |