0

ちょっと基本的に私はWebアプリケーションを書いています、私はapp.jsでevrythingを処理するのが好きではなかったので、ページ関数を処理するevent.jsという1つのスクリプトを作成し、それらをエクスポートするだけです.データベースから何かをリストする必要がありますが、それほどエレガントではないことはわかっていますが、イベントとコールバックを試してみました...これが私のコードで、呼び出しなどは何もありません。この場合、最初は何もロードできません。彼は価値観を持っています..

//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);
    }
  } 
} 

私のオブジェクトは、このコードで名前が会計されているときです。ロードされた情報を1ページレンダリングするのが好きです。以前は機能していませんでした。イベントjsから、基本的には非常にうまく機能していますが、問題は..データベースの読み取りが完了する前にレンダリングが実行されていることです..どういうわけか、データの読み取りが終了するまでレンダリングを待機させてから、レンダリングを実行する必要があります。

4

2 に答える 2

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
    }
  } 
} 
于 2013-05-20T14:34:59.457 に答える
0

app.js で作成したデータベース オブジェクトに event.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;
}
于 2013-05-19T19:16:38.227 に答える