使用node.js上的websockets加载页面加载时的聊天消息

时间:2014-08-04 03:42:38

标签: ajax node.js websocket socket.io

您好我正在使用nodejs开发一个聊天应用程序我是节点新手所以我对它的功能并不是很熟悉...我已经将我的应用程序存储在mysql数据库上但我需要还显示过去的消息,这里的用户当前是index.js

    var mysql =  require('mysql'); 
var app = require('express')();
var http = require('http').Server(app);
var io = require('socket.io')(http);
var validator;

var connection =  mysql.createConnection({ // setup the connection
        host : "localhost",
        user : "root",
        password: "",
})
function getStdout(command, args, fn) {
    var childProcess = require('child_process').spawn(command, args);
    var output = '';
    childProcess.stdout.setEncoding('utf8');
    childProcess.stdout.on('data', function(data) {
        output += data;
    });
    childProcess.on('close', function() {
        fn(output);
    });
}

app.use('/assets', require('express').static(__dirname + '/assets'));
app.use('/temp', require('express').static(__dirname + '/temp'));
app.get('/', function(req, res){
  //res.sendfile(__dirname + '/' +validator);
  res.send(validator);
});

//you should have only one io.on('connection')
io.on('connection', function(socket){
  socket.on('chat message', function(msg){
    console.log('message: ' + msg);

       var myMsg= msg; // obtain the incoming msg
  var strQuery = "INSERT INTO chat_storage(chat) VALUES(?)"; // your SQL string

  connection.query("use schat"); // select the db
  connection.query( strQuery, myMsg, function(err, rows){
     if(err) {
        // handle errors
     } else {  
      io.emit('chat message', msg);
        // message received
     }
   }); 

  });
});

getStdout('php', ['message.php'], function(output) {
  validator = output;
  //start your server after you get an output
  http.listen(3000, function(){
    console.log(validator);
  });
});

现在这里是加载聊天消息的页面

    <?php startblock('script') ?>

 <script src="/socket.io/socket.io.js"></script>
    <script src="http://code.jquery.com/jquery-1.11.1.js"></script>
    <script>
      $(document).ready(function(){

      $.ajax({ 
        url: "localhost:3000/includes/message/store_chat.php",
        type: "POST",
          dataType: "html",
        success: function (result) {
          $("#messages").html(result);

        }
      });

      });

      var socket = io();
      $('form').submit(function(){
        socket.emit('chat message', $('#m').val());
        $('#m').val('');
        return false;
      });
      socket.on('chat message', function(msg){

         $('#messages').append($('<li>').text(msg));
});
</script>
<?php endblock(); ?>

我的想法是一旦页面加载我的聊天消息我试图使用ajax实现它,你可以在我提供的脚本上看到..但它没有好的根本没有工作请帮助我

1 个答案:

答案 0 :(得分:1)

一些建议:

1)将所有消息存储在内存中(除非您看到这些消息增长到几MB),以便您可以快速赶上任何新客户端。

2)使用socket.io发送已存储的聊天消息而不是AJAX调用。

我还包括SequelizeJS而不是原始MySQL - 它有一个更清晰的原始查询模型,并允许您根据需要转换到各种类型的DAO模型。

<强> app.js

// Highly suggest replacing raw mysql with SequelizeJS - http://sequelizejs.com/
var Sequelize = require('sequelize'),
  app = require('express')(),
  http = require('http').Server(app),
  io = require('socket.io')(http);

var validator;
var messages = [];

var sequelize = new Sequelize('schat', 'root', '');

app.use('/assets', require('express').static(__dirname + '/assets'));
app.use('/temp', require('express').static(__dirname + '/temp'));
app.get('/', function(req, res){
  res.send(validator);
});

io.on('connection', function(socket){
  // Send all previously sent messages
  for( i in messages ) {
    socket.emit('chat message', messages[i]);
  }

  socket.on('chat message', function(msg){
    console.log('message: ' + msg);

    // Push the message into the in-memory array.
    messages.push(msg);

    // Storage the message for when the application is restarted.
    sequelize.query('INSERT INTO chat_storage(chat) VALUES("'+msg'")').success(function() {
      // Insert was successful.
    }).error(function (err) {
      // Error inserting message
    });

    // Send the message to everyone
    socket.broadcast.emit('chat message', msg);
  });
});

function getStdout(command, args, fn) {
  var childProcess = require('child_process').spawn(command, args);
  var output = '';
  childProcess.stdout.setEncoding('utf8');
  childProcess.stdout.on('data', function(data) {
    output += data;
  });
  childProcess.on('close', function() {
    fn(output);
  });
}

// Load Messages
sequelize.query('SELECT chat FROM chat_storage').success(function (rows) {
  for( i in rows ) {
    messages.push(rows[i].chat);
  }
  getStdout('php', ['message.php'], function(output) {
    validator = output;
    http.listen(3000, function(){
      // Start server.
    });
  });
}).error(function (err) {
  // Error!
});

php include

<?php startblock('script') ?>

<script src="/socket.io/socket.io.js"></script>
<script src="http://code.jquery.com/jquery-1.11.1.js"></script>
<script>
  var socket = io();
  $('form').submit(function(){
    socket.emit('chat message', $('#m').val());
    $('#messages').append($('li').text($('#m').val()));
    $('#m').val('');
    return false;
  });
  socket.on('chat message', function(msg){
    $('#messages').append($('<li>').text(msg));
  });
</script>
<?php endblock(); ?>