2017-08-13 12 views
0

私はNode.jsの学習中ですが、どのようにしてmysqlクエリの結果をAPIレスポンスとして返すかについては固執しています。私が今までに読んだことから、約束を返して解決する必要があるように見えますが、私はどのようにデータを返すことができないのか分かりません。約束:応答を得る方法?

function get_free_count() { 
    return new Promise(function(resolve,reject) { 
     var sql = "SELECT COUNT(id) AS number FROM users"; 
     conn.query(sql, function(err,result) { 
      if(err) return reject(err); 
      console.log(result[0].number); 
      resolve(result[0].number); 
     }); 
    }); 
} 

app.get('/users/free/count', function(req,res) { 
    var output; 
    output = get_free_count().then(res.json(output)); 
}); 

レスポンスポイントを解決して返信しています。私がthen()関数の中でコールバック関数を作成した場合、範囲外であるためにresオブジェクトにアクセスすることはできません。これまでのところ、私はデータベース値を返す方法を見つけることができませんでした。私の無料カウントをAPIレスポンスとして返す方法は何ですか?

ありがとうございます。

+0

は約束を自分で 'conn.query'をラップしていない約JavaScriptの作業で閉鎖が、あなたがより多くを読むことができる方法である、[あります。下記の例では何も問題はありませんそのためのライブラリ](https://www.npmjs.com/package/promise-mysql) – Kos

+0

はい、 'then'コールには' then'コールが必要なので、 'then'コールでコールバック関数を作成してください。いいえ、コールバックが*クロージャ*であるため、 'res'は範囲外になりません。それを試してみてください! – Bergi

答えて

0

outputthenコールバックに定義する必要があります。また、約束が解決された場合にのみres.jsonに電話する必要があります。現在、すぐに呼び出されます。

app.get('/users/free/count', (req, res) => { 
    get_free_count().then(output => res.json(output)); 
}); 
+0

速い応答のためのalexmacありがとう – calh27

0

私は、()関数内でコールバック関数を作成した場合、私はそれがスコープ外であることに起因するオブジェクトのresにアクセスできるようにするつもりはありません。あなたは間違っているところだ

- あなたはそれがまだ同じスコープになりますのでは、res変数にアクセスすることができるます(私はここで何を意味するか、使用可能なすべての変数にアクセスすることができ、新たな、内側の範囲ということです古い、外側の範囲で)。

app.get('/users/free/count', function(req, res){ 
    // You don't actually need to store the "output" variable, 
    // as it serves no real purpose in your example 
    var output; 
    output = get_free_count().then(function (dbResult) { 
     // req, res, output and dbResult are all valid variables in this scope 
     // "dbResult" is equal to "result[0].number", 
     // the resolution value of "get_free_count()" call 
     res.json(dbResult); 
    }); 
}); 

これは彼らがat MDN "Closures"

+0

どのような理由であなたの例に 'output'変数を残しましたか? – alexmac

+0

それを残しておく理由はありませんが、OPを削除する理由はありません(OPは、例で示したものとは異なる方法で再利用したいかもしれません)。その変数が冗長であるというコメントを追加しました。 – mdziekon

+1

私は、OPはあなたが 'dbResult'と呼んだものに対して' output'という名前を使うことを意図していたと思います。 – Bergi

関連する問題