nodejs res.end 无法在回调中工作
nodejs res.end not working in callback
我正在尝试从数据库中检索数据并将其发回给用户,但由于 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 放在查询之外的函数中并调用它,但似乎没有任何效果。只有当我把它放在查询之外时它才有效,但由于查询是异步的,所以我无法通过这种方式获取任何数据。有没有办法解决这个问题,还是我只是遗漏了什么?
提前致谢!
删除 app.get()
处理程序中对 next()
的调用。
您只想在不处理请求和发送响应并且想让其他处理程序处理请求时这样做。
按照你的方式,你在 con.query()
完成之前调用 next()
以便让 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()
。
在中间件中使用 res 时在 res.
之前抛出一个 return
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();
})
希望这能奏效...
我正在尝试从数据库中检索数据并将其发回给用户,但由于 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 放在查询之外的函数中并调用它,但似乎没有任何效果。只有当我把它放在查询之外时它才有效,但由于查询是异步的,所以我无法通过这种方式获取任何数据。有没有办法解决这个问题,还是我只是遗漏了什么?
提前致谢!
删除 app.get()
处理程序中对 next()
的调用。
您只想在不处理请求和发送响应并且想让其他处理程序处理请求时这样做。
按照你的方式,你在 con.query()
完成之前调用 next()
以便让 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()
。
在中间件中使用 res 时在 res.
之前抛出一个 return 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();
})
希望这能奏效...