zoukankan      html  css  js  c++  java
  • [Node.js]33. Level 7: Persisting Questions

    Let's go back to our live-moderation app and add some persistence, first to the questions people ask.

    Use the lpush command to add new questions to the list named questions. Do this inside thequestion listener.

    var express = require('express');
    var app = express.createServer();
    var socket = require('socket.io');
    var io = socket.listen(app);
    
    var redis = require('redis');
    var redisClient = redis.createClient();
    
    io.sockets.on('connection', function(client) {
      client.on('answer', function(question, answer) {
        client.broadcast.emit('answer', question, answer);
      });
    
      client.on('question', function(question) {
        client.get('question_asked', function(asked) {
          if(!asked) {
            client.set('question_asked', true);
            client.broadcast.emit('question', question);
    
            // add the question to the list here
            redisClient.lpush('questions', question);
          }
        });
      });
    });

    Now that we have questions stored in redis, let's emit them whenever a new client connects to the server through socket.io.

    Use the lrange command to retrieve an array of questions that represent the questions list in redis. Inside of the lrange callback, use forEach to loop through each question and emit it on the client. Remember, don't use broadcast.emit because we only want to send the questions to the client that is connecting to the server.

    var express = require('express');
    var app = express.createServer();
    var socket = require('socket.io');
    var io = socket.listen(app);
    
    var redis = require('redis');
    var redisClient = redis.createClient();
    
    io.sockets.on('connection', function(client) {
      client.on('answer', function(question, answer) {
        client.broadcast.emit('answer', question, answer);
      });
      
      redisClient.lrange('questions', 0, -1, function(err, messages){
        messages.forEach(function(message){
            client.emit('question', message);
        });
      });
    
      client.on('question', function(question) {    
        client.get('question_asked', function(asked) {
          if(!asked) {
            client.set('question_asked', true);
            client.broadcast.emit('question', question);
            
            redisClient.lpush("questions", question);
          }
        });
      });
    });

    Great work! One last thing though, since every time a new question comes in we store it in thequestions list, we might run into a problem where there are just too many questions stored in that list.

    Add a callback to the lpush command, and inside that callback use the ltrim command to make sure the questions list always has at most 20 items.

  • 相关阅读:
    Qt QString判断是否是数字
    Qt 判断QString中的字符串是否为纯数字
    Qt delete和deletelater的区别
    Qt QTcpSocket waitForReadyRead()等函数用法——客户端开关读写应用笔记
    Notepad++对比两个文件不同的方法
    Qt error C1071 :在注释中遇到意外的文件结束
    Qt error C2601: “...”: 本地函数定义是非法的
    Qt 错误 C1071 在注释中遇到意外的文件结束 的解决办法
    Qt 串口和线程的简单结合(通过子线程操作串口、movetothread)
    Qt 实现多线程的串口通信
  • 原文地址:https://www.cnblogs.com/Answer1215/p/3883938.html
Copyright © 2011-2022 走看看