gpt4 book ai didi

mysql - nodejs res.end 在回调中不起作用

转载 作者:行者123 更新时间:2023-11-29 10:38:40 24 4
gpt4 key购买 nike

我正在尝试从数据库检索数据并将其发送回用户,但由于 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 函数也不会发送任何数据。

我尝试了很多变体,使用 waterfall 回调,将 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()

关于mysql - nodejs res.end 在回调中不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45949699/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com