Javascript Express-数据库内容更改时刷新视图变量
我正在使用Express,我正在从数据库生成页面。在服务器启动时,我已生成导航 此块在服务器启动时执行:Javascript Express-数据库内容更改时刷新视图变量,javascript,node.js,express,Javascript,Node.js,Express,我正在使用Express,我正在从数据库生成页面。在服务器启动时,我已生成导航 此块在服务器启动时执行: database.connect() .then(() => { generators.navigation(); }) .catch(err => { console.log(err); process.exit(); }); 我有以下生成导航的代码:
database.connect()
.then(() => {
generators.navigation();
})
.catch(err => {
console.log(err);
process.exit();
});
我有以下生成导航的代码:
generators.navigation = function(){
var db = require('./database.js').db;
var data = db.collection('navigation').find({},{_id:0,path:1,title:1});
var nav = []
data.on('data', doc => {
nav.push(doc)
})
data.on('end', () => {
generators.navigation = nav;
})
}
然后在页面呈现中使用:
for (let page of pages) {
if(req.params.path === page.path){
res.render(page.type, {
page:page,
navigation:generators.navigation,
helpers:helpers
});
}//if
}//for
在我看来(使用把手):
{{{{if#u eq page.contents.nav.type'default'}
{{{#每个导航}
{{/每个}}
{{/if_eq}
问题是,当在数据库中插入新对象时,这不会更新导航,因为此代码仅在服务器启动时执行,并且需要重新启动服务器才能读取数据库中的新更改
当数据库更新时,建议it使用哪种方式监视数据库更新并刷新导航对象?不要写入生成器。导航();在服务器启动时。nodejs中提供了在请求前/请求后触发的钩子,因此您可以使用此钩子调用generators.navigation()函数。正如iam所假设的,将有一个on函数将nav项目添加到数据库中。因此,一旦请求完成,您就可以在请求挂钩后的请求中调用generators.navigation()不要编写generators.navigation();在服务器启动时。nodejs中提供了在请求前/请求后触发的钩子,因此您可以使用此钩子调用generators.navigation()函数。正如iam所假设的,将有一个on函数将nav项目添加到数据库中。因此,一旦该请求完成,您就可以调用generators.navigation(),在该请求之后的请求挂钩中,最合适的解决方案可能是在每次数据库更新时触发导航结构更新,您可以使用WebSocket进行实时轮询。是一个很好的实时更新库可能最合适的解决方案是在每次数据库更新时触发导航结构更新,您可以使用WebSocket进行实时轮询。是一个很好的实时更新库数据库是由完全不同的应用程序用PHP编写的。在这种情况下,使用中间件函数,如函数myMiddleware(req,res,next){if(req.method=='GET'){//Do some code}//继续执行路由器中间件next()}应用程序。使用(myMiddleware)所以在这个函数中调用generators.navigation();所以它会为每个请求触发,因为您无需检查(req.method==='get')我是否从未使用过socket.io,但我会尝试一下,同时,我与其他开发人员交谈,并要求他在更新数据库时提供get请求。这似乎是个好主意。谢谢你,伙计!数据库由用PHP编写的完全不同的应用程序填充。在这种情况下,使用中间件函数,如函数myMiddleware(req,res,next){if(req.method=='GET'){//Do some code}//继续执行路由器中间件next()}app.use(myMiddleware)所以在这个函数中调用generators.navigation();所以它会为每个请求触发,因为您无需检查(req.method==='get')我是否从未使用过socket.io,但我会尝试一下,同时,我与其他开发人员交谈,并要求他在更新数据库时提供get请求。这似乎是个好主意。谢谢你,伙计!
{{#if_eq page.contents.nav.type 'default'}}
{{#each navigation}}
<a class="item no-mobile" href="{{this.path}}">{{this.title}}</a>
{{/each}}
{{/if_eq}}