在Express 3.x和Jade模板中使用NodeJS可以重新渲染一个以前渲染列表的项目吗?

我一直在试图find任何可以解释是否有可能重新呈现一个“新”项目(附加)到玉模板列表的文章。

  1. 假设我们有一个日志条目列表,在第一次请求时,我们使用res.render和Jades的每个function来呈现MongoDB集合“日志”中的获取列表。

  2. 由于我们想从数据库中检索更新,因此我们也有一个MongoWatch附加到那个监听变化的集合。 更新后,我们可以执行一些附加到Jade-template中的第一个列表的代码?

    /* app.js */ /* Display server log */ app.get ('/logs', function(req, res, next) { // Using Monk to retrieve data from mongo var collection = db.get('logs'); collection.find({}, function(e,docs){ // watch the collection watcher.watch('application.logs', function(event){ // Code that update the logs list with the new single entry event.data? }); // Request resources to render res.render('logs', { logs: docs } ); }); }); <!-- logs.jade --> extends layout block content div each log in logs div.entry p.url= log.url 

也许我应该以另一种方式使用模板引擎,我对Express,Jade很新颖,非常感谢所有花时间回答这些问题的人。

// 问候

好的,所以我查了一下Jonathan Lenowski的build议,谢谢你的提问,我想出了一个解决问题的办法。 以为我会跟进,也许帮助别人一路上..

基本上我现在使用build议的socket.io

  1. 因此,首先将socket.io npm模块添加到package.json中,然后运行npm install,我使用'latest'作为版本。 接下来在客户端使用'socket.io.js',你实际上必须将文件从已安装的socket.io模块复制到你的javascript文件夹。

     Path (seen from project root is): 'node_modules/socket.io/node_modules/socket.io-client/dist/' 
  2. 在服务器端安装数据库,监视器,Web服务器,套接字和控制器

     /* SETUP DATABASE HANDLE in app.js */ var mongo = require('mongodb'); var monk = require('monk'); var db = monk('localhost:'+app.get('port')+'/application'); /* SETUP DATABASE UPDATE WATCH */ var watcher = new MongoWatch({ format: 'pretty', host: 'localhost', port: app.get('port') }); /* START WEBSERVER AND SETUP WEBSOCKET */ var server = Https.createServer({key: certData.serviceKey, cert: certData.certificate}, app); var io = require('socket.io').listen(server); server.listen(app.get('port'), function(){ console.log('Express server listening on port ' + app.get('port')); }); /* Display server log - controller */ app.get ('/logs', function(req, res, next) { // Using Monk to retrieve data from mongo var collection = db.get('logs'); collection.find({}, function(e,docs){ // watch the collection logs in database application watcher.watch('application.logs', function(event){ io.sockets.emit('logs', { log: event.data }); }); // Request resources to render res.render('logs', { logs: docs } ); }); }); 
  3. 在布局中包含socket.io JavaScript

     /* Add client side script in layout.jade */ script(type='text/javascript' src='/javascripts/socket.io.js') 
  4. 使用客户端

     /* SETUP DATABASE HANDLE in logs.jade */ extends layout block content script. var socket = io.connect('https://localhost:4431'); socket.on('logs', function (data) { console.log(data.log); // Here we use javascript to add a .log-entry to the list // This minor detail i leave to the developers own choice of tools }); div.row#logs div.col-sm-12 div.header-log Some application div.logs-section each log in logs div.log-entry.col-sm-12(data-hook=log.status) p.method= log.method p.url= log.url p.status(style='color: #'+log.color+' !important')= log.status p.response-time= log.time p.content-length= log.length p.datetime= log.date 
  5. 使用这个function,记住这个stream程是通过在数据库'application'和集合'logs'中实际添加一行来触发的。

因此,我使用ssl与普通的http,我们创build一个“http”服务器,并从客户端连接的标准地址前缀http:// …

还有一点需要注意的是,为了使用MongoWatch,需要设置MongoDB的复制集。 哪一个镜像数据库可以用作后备(双重目的)。

干杯! 再次感谢乔纳森!