2017-02-09 12 views
1

Я пытаюсь переделать шаблон мопса через setInterval().Я пытаюсь переделать шаблон мопса через setInterval(). Это возможно?

Я пытаюсь показать данные на живом экране страницы с сервера MySQL. Я могу получить данные на странице, но я не знаю, как обновлять данные, не обновляя всю страницу.

Я попытался реализовать AJAX, а также попытался сделать это через socket.io, но не смог отправить данные в шаблон мопса для обеих попыток.

Server.js

var express = require('express'); 
var app = express(); 
var http = require('http'); 
var server = http.createServer(app); 
var pug = require('pug'); 
var io = require('socket.io').listen(server); 
var clients = []; 
var outsideData = require('./public/data.js'); 

app.set('views', __dirname + '/views'); 
app.set('view engine', 'pug'); 
app.use(express.static(__dirname + '/public')); 

app.get('/', function(req, res) { 
    res.render('index.pug', { 
     data: outsideData.getData() 
    }); 
}); 

io.sockets.on('connect', function() { 
    clients.push(io.sockets); 
    console.log("connected"); 
}); 

//Recompile Pug Template 
function recompile() { 
    var pug = require('pug'); 
    var template = require('fs').readFileSync('./views/index.pug', 'utf8'); 
    var pugFn = pug.compile(template, { 
     filename: './views/index.pug', 
     pretty: true 
    }); 
    var renderedTemplate = pugFn({ 
     data: outsideData.getData() 
    }); 
} 

//Send data every second. 
setInterval(function() { 
    for (i = 0; i < clients.length; i++) { 
     recompile(); 
     clients[i].emit('data', outsideData.getData()); 
    } 
}, 30000); 

//Handle diconnected clients. 
io.sockets.on('disconnect', function() { 
    var index = clients.indexOf(io.socket); 
    if (index != -1) { 
     clients.splice(index, 1); 
    } 
}); 

server.listen(3001); 

index.pug

doctype html 
html 
    head 
     title Socket Communication 
     script(src='https://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js') 
     script(src="/socket.io/socket.io.js") 
     //script(src="client.js") 
     var socket = io.connect(); 
     socket.on('data', function(data) { 
      var myData = $('myData'); 
      console.log(data) 
     }); 
    body 
     h1= "Help me..." 
     p= JSON.stringify(data) 

Update: Вот изменения, которые работает. Спасибо, mk12ok.

Server.js

var express = require('express'); 
var app = express(); 
var http = require('http'); 
var server = http.createServer(app); 
var pug = require('pug'); 
var io = require('socket.io').listen(server); 
var clients = []; 
var outsideData = require('./public/data.js'); 

app.set('views', __dirname + '/views'); 
app.set('view engine', 'pug'); 
app.use(express.static(__dirname + '/public')); 

app.get('/', function(req, res) { 
    res.render('index.pug'); 
}); 

io.sockets.on('connect', function() { 
    clients.push(io.sockets); 
    console.log("connected"); 
}); 

//Send data every second. 
setInterval(function() { 
    for (i = 0; i < clients.length; i++) { 
     clients[i].emit('data', outsideData.getData()); 
    } 
}, 1000); 

//Handle diconnected clients. 
io.sockets.on('disconnect', function() { 
    var index = clients.indexOf(io.socket); 
    if (index != -1) { 
     clients.splice(index, 1); 
    } 
}); 

server.listen(3001); 

index.pug

doctype html 
html 
    head 
     title Socket Communication 
     script(src="/socket.io/socket.io.js") 
     //script(src="client.js") 
    body 
     h1= "Help me..." 
     p(id="data") 
     script. 
      var socket = io.connect(); 
      socket.on('data', function(data) { 
       //Replace JSON.stringify(data) with JSON.stringify(data.tag) to retrieve a specific value stored in your JSON data. 
       document.getElementById("data").innerHTML = "Received" + JSON.stringify(data); 
       console.log(data) 
      }); 
+0

Вам не придется обновлять 'index.pug' а обновлять страницу с данными, посланных клиенту через' socket.io' – mk12ok

+0

Обновив страницу вы имеете в виду я обновить индекс .pug? Я не совсем понимаю, что делать с данными, которые поступают на страницу через socket.on(). Console.log (data) печатает это нормально, но я не знаю, как передать эти данные в мопс-переменную , p = data – Student

+0

Я имею в виду, что вы можете обновить страницу с помощью манипуляций DOM с помощью простого javascript или jquery. Насколько я понимаю, вы будете отправлять массивы с результатами запросов mysql. Вы можете легко показать данные на странице несколькими способами. Пожалуйста, покажите html-код вашей страницы, и мы сможем работать над этим. – mk12ok

ответ

2

Вместо повторного рендеринга мопс файл, который вы можете попробовать это:

сервера (очень тот же код) :

const express = require('express'); 
const app = express(); 
const http = require('http').Server(app); 
const io = require('socket.io')(http); 
const pug = require('pug'); 

app.set('views', __dirname + '/views'); 
app.set('view engine', 'pug'); 
app.get('/', function(req, res) { 
    res.render('index.pug'); 
}); 

setInterval(function() { 
    io.emit('data', 'random number: ' + Math.random().toString()); 
}, 1000); 

io.on('connection', function (socket) { 
    console.log('client connected');  
    socket.on('disconnect', function() { 
     console.log('client disconnected'); 
    }); 
}); 

http.listen(3001, function(){ 
    console.log('listening on *:3001'); 
}); 

и пример из index.pug:

doctype html 
html 
    head 
    title Testing socket.io 
    body 
    h1 Testing socket.io 
    br 
    h3(id="status") not connected 
    br 
    p(id="data") 
    script(src="/socket.io/socket.io.js") 
    script. 
     var socket = io(); 

     socket.on('connect', function() { 
     document.getElementById("status").innerHTML = "connected"; 
     }); 

     socket.on('data', function(data) { 
     document.getElementById("data").innerHTML = "Received " + data; 
     });