【问题标题】:nodejs auto refresh view after database updates数据库更新后nodejs自动刷新视图
【发布时间】:2016-05-03 15:55:59
【问题描述】:

每当一个函数对数据库进行更改时,我想使用 nodeJS 来刷新我的视图。如果我们以 MEAN-stack 为例,我不想每 x 秒发送一次 $http-request 来检查数据库是否发生了更改。我希望前端自动收到通知,然后更新视图。

这方面的最佳做法是什么?我会在服务器端使用某种 Oberserver 模式,但不知道如何通知前端。

【问题讨论】:

  • 我不同意。我已经解释过服务器端部分对我来说很清楚。我对无需轮询将更改传达给客户端的方式感兴趣。
  • 答案并不是暗示您应该使用轮询,而是说使用 pub/sub。有很多教程展示了如何在平均堆栈中使用 pub/sub。
  • 好的,我会在这个方向上进行更多研究。创建问题时,我不知道它被称为 pub/sub。感谢您的支持。
  • 没问题,祝你申请顺利!

标签: node.js design-patterns mean-stack


【解决方案1】:

要让前端自动获得通知,然后更新视图,您可以使用 Socket.io 框架。 您可以在他们的网站上找到所有文档:http://socket.io/ 这是一个基本的例子:

app.js(设置服务器)

var http = require('http');
var express = require('express');
var port = normalizePort(process.env.PORT || '1000');
var app = express();
var server = http.createServer(app);
server.listen(port);

io = require('socket.io')(server);

///ROUTES
var routes = require('./routes/index')(io);
var users = require('./routes/users');
///////

我将 io 对象传递给路由索引(当然,在 app.js 上还有很多东西……这只是一个基本示例……)。

mysql.js(创建连接池)

var mysql = require("mysql");
var pool = mysql.createPool({
host     : 'host',
user     : 'user',
password : 'pass',
database : 'db_name',
connectionLimit: 1000
});

exports.pool = pool;

index.js

module.exports = function(io) {
 var express = require('express');
 var router = express.Router();
 var mysql = require('../mysql.js').pool;

 io.on('connection', function (socket) {
        socket.on('event_name', function (data) {
    mysql.getConnection(function(err,connection){
        if (err) {
          connection.release();
          return;
        }               
         connection.query("SQL STUFF",function(err,rows){
            if(rows.length>0){//checks if there are more than 0 rows returned.....
                socket.emit('do_something',data_you_want_to_pass);
            }
            else{
                socket.emit('do_something_else',data_you_want_to_pass);
            }
            connection.release();    
         });

          connection.on('error', function(err) {      
            return;    
          });
    });
  });

});

router.get('/', function(req, res) {
res.render("index"); 
});

return router;
}

然后在 html 页面上你有 socket.emit 和 socket.on 了.....

我建议您查看文档和其他一些示例...

希望对你有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多