2017-06-25 20 views
0

値を返すが未定義の関数を実行しようとしました。私はNodeJSのMySQLクエリ関数外で変数を拡張する

{ 
    id : 3, 
    userFrom : 3, 
    userTo : 1, 
    type : "normal", 
    date : "2017-06-25 06:56:34", 
    deleted : 0 
} 

のような予想される結果を得るsqlをCONSOLE.LOGしようとした。しかし、私はmsgIdをCONSOLE.LOGとき、私はundefinedを得る今

function getMessageId(myId, user){ 
    $query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+ myId+"')"; 
    connect.query($query, function(error, rows){ 
     sql = rows[0]; 
     console.log(sql); 
     return sql.id; 
    }) 
} 

// running the function 
msgId = getMessageId(userFrom, userTo); 
console.log(msgId); 

。私はNodeJSでこれをやっています、もっと良い解決策をお聞かせください。

+1

として使用することができます。しかし、いずれにしても、準備されたステートメントを使用する必要があります。 –

答えて

2

短い答えは、その非同期操作です。 外部console.logは、getMessageIdが返される前に発生します。

コールバックを使用している場合、あなたは私はあなたが約束を調べることをお勧め getMessageId(userFrom, userTo, setMsgId);

さらに、getMessageId

let msgId 
function getMessageId(myId, user, callback){ 
$query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+ myId+"')"; 
return connect.query($query, function(error, rows){ 
    sql = rows[0]; 
    console.log(sql); 
    callback(sql.id); 
}) 
} 

function setMsgId(id) { 
    msgId = id; 
} 

ように書き換え、その後、としてそれを呼び出すことができます。
これは、フローを非常にうまく合理化します。 PromisesgetMessageIdを使用して

function getMessageId(myId, user){ 
    $query = "SELECT * FROM startMessage WHERE (userFrom = '"+myId+"' AND 
    userTo = '"+user+"') OR (userFrom = '"+user+"' AND userTo = '"+ 
    myId+"')"; 
    const promise = new Promise((resolve, reject) => { 
    connect.query($query, function(error, rows){ 
    sql = rows[0]; 
    console.log(sql); 
    resolve(sql.id); 
    }) 
return promise. 
} 

投稿次のようになります、あなたはあなたの観察結果は、あなたが私たちを示したコードと矛盾するように見える
getMessageId(myId, user).then((msgId) => console.log(msgId))

+0

これはあなたの質問に答えますか? – Shivam

+0

最初のメソッドを使用しましたが、コールバックは定義されていません – user7713452

関連する問題