2016-09-22 7 views
0

から値を取得し、私は私のdb.jsにsqlite3のnodejsがテーブル

function getName(uid){ 
    db.all("SELECT name FROM table WHERE uid = ? ", function (err){ 
     if(err){ 
      console.log(err); 
     }else{ 
      console.log(this); 
     } 
    }); 
} 

を関数のgetNameを持っていると私は名前を取得し、別のファイルにするvar名前にそれを保存したいです。

var uid = req.session.user; 

var name = db.getName(uid); 
     console.log(name); 

db関数のgetnameについてどうして私は定義されていないのですか? 私を助けることができれば素晴らしいだろう!

+0

あなたは –

+0

@CodeBean私はdb.get要求をしなければならない 'async'関数から値を返すされていますか?またはデータベースから名前を取得するにはどうすればよいですか? – nolags

+0

私はこれが助けになると思う:https://github.com/mapbox/node-sqlite3/blob/master/examples/simple-chaining.js –

答えて

1

return文の実行時にデータベース要求が完了していない可能性があるため、async関数からデータを返すと、未定義が返されることがあります。

function getName(uid, callback){ 
    var query = "SELECT name FROM table WHERE uid = " + uid; 
    var name = null; 
    db.all(query, function (err, rows) { 
    if(err){ 
     console.log(err); 
    }else{ 
     name = rows[0].name; 
    } 
    }); 
    return name; <--- this can be execute before db.all() if executed therefore returning null. This is because javascript runs asynchronously. 
} 

データベースクエリの結果をコールバックで渡す必要があります。また、グローバル変数に保存することもできます。

function getName(uid, callback){ 
    var query = "SELECT name FROM table WHERE uid = " + uid; 
    db.all(query, function (err, rows) { 
    if(err){ 
     console.log(err); 
    }else{ 
     callback(rows[0].name); 
    } 
    }); 
} 

は、別のファイルから実行するためには:

function print(name) { 
    console.log(name); 
} 
var uid = req.session.user; 
getName(uid, print); 
+0

ありがとう、それは働いた! – nolags

+0

ファンクションプリント以外の名前にはどのようにアクセスできますか? – nolags

+0

グローバル変数usernameをprint関数の外部に宣言します。 var username = '';印刷機能では:username = name; asyncが完了する前にgetNameがusernameにアクセスするasync関数であるため、usernameが ''に設定されます。 –

関連する問題