nodejs res.end无法在回调中工作

时间:2017-08-29 23:25:19

标签: mysql node.js callback httpresponse

我正在尝试从数据库中检索数据并将其发送回用户,但由于mysql查询异步工作,我不能只是将查询代码后发送响应的代码放入,我必须发送在查询的回调函数中的响应。

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放在查询之外的函数中并调用它,但似乎没有任何效果。当我把它放在查询之外时它唯一的工作时间,但由于查询是异步的,我无法通过这种方式获取任何数据。有办法解决这个问题,还是我错过了什么?

提前致谢!

2 个答案:

答案 0 :(得分:1)

移除next()处理程序中对app.get()的调用。

您只希望在不处理请求并发送回复时执行此操作,并且您希望让其他处理程序对请求进行破解。

你拥有它的方式,你在next()完成之前调用con.query()以便让express中的默认处理程序处理请求,因此你的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()

答案 1 :(得分:0)

在中间件中使用res时,在res之前要返回收益。

    app.get('/',function(req,res,next){
    function foo(res){
        con.query('SELECT * FROM `data` WHERE 1',function(err,result){
            if (err) throw err;
            return res.end('weee',function(err){
                if (err) throw err;
            )}
        })
    }
    foo(res)
    next();
})

希望这行得通...