嘿,基本上我正在写一个网络应用程序,我不喜欢在app.js中处理evrything所以我做了一个名为event.js的脚本什么是处理页面功能而我只是导出它们,我的问题是它工作得很好直到我确实需要从数据库中列出一些内容,我知道它不是那么优雅,但我确实试过了whit事件和whit回调...这里是我的代码whitout调用或任何东西,在这种情况下第一次它无法加载任何东西,对于第二次渲染,他有值..
//app.js
app.get('/page',events.page);
//event.js
exports.page = function(req,res,next) {
if (name == 'Accounting'){
if (req.session.ulevel == 0) {
name='Index';
mg='notauthed';
show='nothing';
} else {
show='accinfo';
name == 'Accounting';
console.log('asdasdasdinfoooo');
pg.connect(connectionString, function(err, client) {
client.on('drain', client.end.bind(client));
client.query('SELECT * FROM newtest5 where id=$1',['uid']
, function(err,results){
dlogin=results.rows[0].username;
did=results.rows[0].id;
dpwd=results.rows[0].password;
demail=results.rows[0].email;
dregdate=results.rows[0].regdate;
drule=results.rows[0].rights;
dmoney=results.rows[0].balance;
// move render here
});
});
res.render('index', {
title: name,
dplay:show,
dbname:dlogin,
dbid:did,
dbpwd:dpwd,
dbrule:drule,
dbregd:dregdate,
dbemail:demail,
username:req.session.user,
uid:req.session.uid,
user:req.session.user,
right:req.session.ulevel,
content:contents[name],
msg:msgs[mg]
}), console.log('data:'+dlogin);
}
}
}
我的对象是当这个名称在这个代码中进行记帐时,我喜欢渲染一个页面,白色加载的信息,而不是现在它的工作,基本上我只是在app js中路由,并且evry函数,并且渲染也完全从事件js导出,它基本上工作得很好,只是问题是..render在数据库读取完成之前运行。我需要做渲染等待数据读取结束,然后执行渲染。
答案 0 :(得分:1)
你的缩进使得无法看到发生了什么。我重新缩进它。当您致电pg.connect(str, callback)
时,您会在其中传递回调,您可以在其中定义dlogin
等。但在致电pg.connect
后,您立即致电res.render()
! javascript引擎等待没人。正确的方法是将res.render()
置于最里面的回调中。这将确保在您实际定义dlogin
等
如果您想为要使用的玉器设置变量(或者可能是其他模板引擎),您也可以使用res.locals
//app.js
app.get('/page',events.page);
//event.js
exports.page = function(req,res,next) {
if (name == 'Accounting'){
if (req.session.ulevel == 0) {
name='Index';
mg='notauthed';
show='nothing';
} else {
show='accinfo';
name == 'Accounting';
console.log('asdasdasdinfoooo');
pg.connect(connectionString, function(err, client) {
client.on('drain', client.end.bind(client));
client.query('SELECT * FROM newtest5 where id=$1',['uid']
, function(err,results){
res.locals.dlogin=results.rows[0].username;
res.locals.did=results.rows[0].id;
// etc...
console.log('data:'+res.locals.dlogin);
// ... it gets set here, when the callback is finally run
res.render('index');
});
});
console.log('data:'+res.locals.dlogin);
// this will be undefined after defining the callback, until the callback is run
// pg.connect() has been run, but not its callback, yet
}
}
}
答案 1 :(得分:0)
如果您尝试从event.js中访问您在app.js中创建的数据库对象,则可以将数据库传递给事件:
//app.js
var db = require('someDB');
var event = require('./event.js')(db);
event.someFunction(function(err, data){
console.log(data);
});
//event.js
module.exports = function(db){
var event = {};
event.someFunction = function(callback){
db.fetch('someone', function(err, data){
callback(err, data);
});
};
return event;
}