【问题标题】:node pg callback event节点 pg 回调事件
【发布时间】:2013-05-20 22:46:31
【问题描述】:

嘿,基本上我正在编写一个网络应用程序,我不喜欢在 app.js 中处理所有事情,所以我确实制作了一个名为 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);
    }
  } 
} 

我的对象是当名称在此代码中计费时,我喜欢渲染一个页面,使用加载的信息,而不是现在它的工作,基本上我只是在应用程序 js 和 evry 函数中路由,并且渲染也完全从事件 js 导出,它基本上工作得很好,只是问题是..render 在数据库读取完成之前运行..不知何故我需要让渲染等待数据读取结束,然后执行渲染。

【问题讨论】:

  • 不要以纯文本形式存储密码
  • 我知道它不那么安全,但这是最小的问题。

标签: javascript node.js asynchronous callback


【解决方案1】:

您的缩进使我们无法看到发生了什么。我重新缩进了它。当您调用pg.connect(str, callback) 时,您会向它传递一个定义dlogin 等的回调。但是在您调用pg.connect 之后,您会立即调用res.render()! JavaScript 引擎不等待任何人。正确的方法是将res.render() 放在最里面的回调中。这将确保在您实际定义 dlogin 等之前不会发送响应。

如果你想设置变量让jade使用(或者可能是其他模板引擎),你也可以使用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
    }
  } 
} 

【讨论】:

  • 感谢兄弟重新编辑我的帖子,您的解决方案看起来非常好,只是问题是它的效果没有,我的意思是渲染没有运行...只是第一次尝试它似乎工作时,cuse直到你回答我试图绕过它,在开始时加载所有数据,渲染是从数据库中加载变量,以这种方式。
【解决方案2】:

如果您尝试从 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;
}

【讨论】:

  • 请再次检查一下,我确实编辑了我的 stuf 以更详细地解释它现在的外观,无论如何感谢您的帮助
  • 你在 event.js 中引用了pg.connect;你在哪里定义pg? event.js 有正确的pg 对象吗?如果pg是在app.js中创建的,像我上面演示的那样传入
  • 哦,您可能还需要将 res.render 调用移动到最里面的回调中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-28
  • 1970-01-01
  • 2015-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
相关资源
最近更新 更多