2017-01-03 29 views
-2

私はnode.jsが新しく、私の学校プロジェクトで約束を使用したいと思います。私はいくつかのオンラインおよびスタック上の発見した :Use promise to process MySQL return value in node.js約束Node.js mysql

をしかし、私は疑問を持って、これまでのところ、これは私が持っているものである:これは私のために働いている

router.post('/matchaSearch', function(req, res) { 
    var username = session.uniqueID; 
    var searcherPackage = {}; 

    function userAgeCheck(randomParam) { 
    return new Promise((resolve, reject) => { 
     pool.getConnection((err, connection) => { 
     var query = 'SELECT username, age, orientation, sex FROM usersinfo WHERE username != ?'; 
     connection.query(query, [username], (err, rows, fields) => { 
      connection.release(); 
      return err ? reject(err) : resolve(rows); 
     }); 
     }); 
    }); 
    } 

    userAgeCheck('username') 
    .then((rows) => { 
     /*console.log(rows);*/ 
     searcherPackage = rows; 
     console.log(searcherPackage); 
     // do stuff 
    }).catch((err) => { 
     throw err; 
    }); 
}); 

、それは私からすべてを返します私以外のユーザー名(ユーザー名)。しかし、私にとってこれは正しいことではありません。なぜランダムなパラメータを与えるのが良いのですか?

私は 'randomParam'の代わりにparamとして 'username'を与える​​べきですが、私がそれを行うと、クエリは私(username)以外のすべての人の代わりにすべてを返します。 だから私はそれを取り除いて、ただそれに 'randomParam'を与えて、それは働いた。 これを説明できますか?私はこの権利をしていますか?もしそうなら、私は自分のプロジェクトを続けることができます。 ありがとうございました!

+0

引用符で囲まれたコードの 'randomParam'には目的がありません。それはあなたのコードですね。それでなぜそこにいるのですか?それは何をすべきか? –

+1

'pool.getConnection'コールバックの' err'もチェックする必要があります。また、Bluebirdのようなライブラリを使用して、これらのメソッドを適切に連鎖させることを約束し、返された約束を自動的に拒否するようにしてください。 – cdhowie

+0

'Promise.promisify'を使ってNode.jsスタイルのコールバックメソッドを自動的に約束に変換して、独自のラッパーを書く必要がないことを忘れないでください。 – tadman

答えて

1

userAgeCheckuserAgeCheck('username'))を呼び出すときは、1つの引数を渡します。「username」という文字列を含む文字列リテラル。これはrandomParamに割り当てられます。決してユーザーは意味がありません。


あなたはあなたのスクリプトの先頭で変数を定義します。クエリを作るときvar username = session.uniqueID;

あなたはusername != ?のプレースホルダ値としてusername変数の値を渡します。

変数を広い範囲から読み取るため、これはsession.uniqueIdの値です。

結果として、ユーザ名がsession.uniqueIdの場合を除き、すべての結果が返されます。


あなたはusernameからrandomParamの名前を変更する場合は、値"username"usernameと呼ばれる新しい、ローカル変数を持っています。

結果として、ユーザー名が実際にはのユーザー名のもの以外のすべての結果が返されます。


あなたが引数としてユーザー名を渡したいなら、あなたはuserAgeCheck(username)userAgeCheck('username')を変更する必要があります。文字列リテラルを変数名で置き換える。

+0

あなたの答えをありがとう、だからあなたが言っている: 私の[username]は私の の値として私のconnection.queryでvar username = session.uniqueID私のコードの最上部に? だから私は関数 'function userAgeCheck(randomParam)'を宣言するとき 私はそれに任意のパラメータを与える必要がありますか?なぜ私はそれをしなければならないのでしょうか? – pkerckho

+0

@pkerckho - パラメータを使用しない場合は、引数リストにパラメータを定義しないで、関数を呼び出すときに引数を渡さないでください。それを使うつもりなら、どこでも同じ名前を使い、文字列リテラルの代わりに渡したい*変数*を渡してください。 – Quentin

+0

私はそれを得る、あなたの助けに感謝!私はパラメータを持たない小さな関数であればダースを作成し、dbからのすべてのデータをオブジェクトに入れ、オブジェクトとして最後の関数をパラメータとして作成します。私はそれが正しい考えだと思う!ありがとう ! – pkerckho