我正在尝试从数据库中检索数据并将其发送回用户,但由于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放在查询之外的函数中并调用它,但似乎没有任何效果。当我把它放在查询之外时它唯一的工作时间,但由于查询是异步的,我无法通过这种方式获取任何数据。有办法解决这个问题,还是我错过了什么?
提前致谢!
答案 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();
})
希望这行得通...