Sails.js Redis如何流式传输数据?

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的每一个变化.

谢谢你们.

Ofe*_*man 2

您提出了几个问题,让我们尝试一一回答:

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)