web-dev-qa-db-ja.com

データベース更新後のnodejs自動更新ビュー

関数がデータベースに変更を加えるたびに、nodeJSを使用してビューを更新したいと思います。 MEAN-stackを例にとると、データベースに変更が加えられているかどうかを確認するために、x秒ごとに$ http-requestを送信したくありません。フロントエンドに自動的に通知を受け取り、ビューを更新してほしい。

これのベストプラクティスは何ですか?サーバー側である種のOberserverパターンを使用しますが、それをフロントエンドに通知する方法がわかりません。

5
molerat

フロントエンドに自動的に通知を受け取り、ビューを更新するには、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が再びあります.....

ドキュメントと他のいくつかの例をご覧になることをお勧めします...

私はあなたを助けたと思います。

12
Tom Šabanov