2017-08-29 16 views
0

データベースからデータを取得してユーザーに返すのですが、mysqlクエリが非同期で動作するため、クエリコード、私は、クエリのコールバック関数内で応答を送信する必要があります。nodejs res.endがコールバックで動作しない

var express = require('express'); 
var fs = require('fs'); 
var mysql = require('mysql') 
var app = express(); 
var con = mysql.createConnection({ 
    host:"localhost", 
    user:"root", 
    password:"", 
    database:"tempdb" 
}) 
app.use(function (req, res, next) { 
    res.setHeader('Access-Control-Allow-Origin', 'http://localhost'); 
    res.setHeader('Access-Control-Allow-Methods', 'GET, POST, OPTIONS, PUT, 
    PATCH, DELETE'); 
    res.setHeader('Access-Control-Allow-Headers', 'X-Requested-With,content- 
    type'); 
    res.setHeader('Access-Control-Allow-Credentials', true); 
    next(); 
}); 
app.get('/',function(req,res,next){ 
    function foo(res){ 
     con.query('SELECT * FROM `data` WHERE 1',function(err,result){ 
      if (err) throw err; 
      res.end('weee',function(err){ 
       if (err) throw err; 
      )} 
     }) 
    } 
    foo(res) 
    next(); 
}) 
app.listen(1001) 

も、このような単純なもので、データベースからデータが全く処理されるか、使用されていない場合、res.end機能は、任意のデータを送信しません。

私は、ウォーターフォールコールバックを使用して、res.endをクエリの外に置いて呼び出しても、何もうまくいかないように、多くのバリエーションを試しました。私はそれをクエリの外に置いたときにそれが動作する唯一の時間ですが、クエリが非同期であるため、そのようにデータを取得することはできません。これを回避する方法はありますか、私は何かが欠けていますか?

ありがとうございます!

答えて

1

app.get()ハンドラーのnext()への呼び出しを削除します。

リクエストを処理せず、レスポンスを送信し、リクエストで他のハンドラにクラックが発生しないようにする場合にのみ、この処理を行います。

あなたがそれを持っている方法、それは急行ハンドルのデフォルトのハンドラ要求とをすることができますので、あなたはcon.query()終了する前next()を呼び出しているので、あなたのres.end()応答がすでにこのリクエストのために送られているため、実際には何もしません。ここで

は、私が示唆しているものです:

app.get('/', function(req, res){ 
    con.query('SELECT * FROM `data` WHERE 1',function(err, result){ 
     if (err) { 
      console.log(err); 
      res.status(500).end(); 
     } else { 
      res.send('weee'); 
     } 
    }); 
}); 

あなたが応答を送信するつもりはありません、あなたはハンドラチェーン内の他の誰かが応答を送信したいのであれば、あなただけnext()を呼び出します。

+0

あなたは人生の節約になりましたありがとう、私は決して自分自身を得たでしょう。多くの愛 –

関連する問題