【问题标题】:Sails.js Redis How to stream data?Sails.js Redis 如何流式传输数据?
【发布时间】:2015-04-28 06:48:02
【问题描述】:

我一直在寻找信息以了解如何将 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

无论我在 .where 中设置什么。

我也尝试过这样做:

型号

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);
    });

在谷歌上我发现了这个

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>

当我单击按钮时,控制台的结果如下:

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)

对不起,我知道我是新手,我确定我做错了(或很多事情),你能帮帮我吗?我想要的只是将数据从 Redis 流式传输到视图。我想在视图中看到 Redis 的每一个变化。

谢谢大家。

【问题讨论】:

  • 1.您是否已经在 Redis DB 中有数据?您需要从当前的 Redis DB 中获取数据,对吧? 2. 不用where也可以获取数据:Redis.find().exec(function(err, users) { console.log("User: " + users + " - " + err); });那么如果你请求这样的数据呢?

标签: node.js redis sails.js waterline


【解决方案1】:

您的问题有好几个,我们来一一解答:

Redis 架构格式

Redis 支持多个data structures,其中sails-redis 使用set 作为索引,使用二进制字符串存储数据。 如果一部分数据可以作为主键使用它可以提高系统性能,如果不是,sails-redis会自动根据序列生成主键。

根据您的定义,您的架构应该是这样的:

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

要开始使用它,您可以通过创建一个空控制器来使用blueprints api

检索数据

要从 redis 获取数据,您可以使用 blueprints api 通过生成的 id 获取数据,或者您可以使用 find 方法创建一个新的控制器,这是一个示例(对不起,只是简单地调用模型数据):

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',

流数据

目前还没有为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
    });  
  }
}

应该为动作定义一个路由:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-01-18
    • 2019-07-25
    • 2015-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 2010-11-01
    • 1970-01-01
    相关资源
    最近更新 更多