在下面的代码中,我试图从MySQL数据库中检索数据,并使用响应写入将它们显示给用户。我得到的错误是Error: write after end
:
var http = require("http");
var mysql = require('mysql');
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var urlencodedParser = bodyParser.urlencoded({ extended: false })
app.use(express.static('public'));
app.get('/Search.html', function (req, res) {
res.sendFile( __dirname + "/" + "Search.html" );
})
var connection = mysql.createConnection(
{
host : 'localhost',
user : 'root',
password : 'somepass',
database : 'SocialQuery',
}
);
connection.connect();
app.post('/process_post', urlencodedParser, function (req, res) {
// Prepare output in JSON format
response = {
SearchType:req.body.SearchTypes,
Term:req.body.term
};
//var vas = JSON.stringify(response);
var search = req.body.SearchTypes;
var term = req.body.term;
var query = connection.query('Select * from ?? where Lable = ?', [search, term], function(err, rows) {
res.write(rows);
});
console.log(query.sql);
res.end();
})
//}).listen(8081);
http.createServer(app).listen(8081);
console.log('Server running at http://127.0.0.1:8081/');
我将res.write(rows);
更改为res.end(rows);
,但没有成功。有人可以帮我解决这个问题。
答案 0 :(得分:2)
问题是MySQL查询在node.js中是异步的。所以,结果不会在变量查询中,而是在回调中检索到变量行。所以会发生什么是调用res.end(),然后回调并调用res.write(),所以它在end()之后调用。
答案 1 :(得分:2)
从数据库中获取数据时,您正在执行异步调用。 res.write()在回调函数内部,因此在获取数据之前它将调用res.end()并在获取数据后调用res.write()。这就是你获得Error: write after end
的原因。您可以在同一个回调函数中使用res.end()。
var query = connection.query('Select * from ?? where Lable = ?', [search, term], function(err, rows) {
res.write(rows, function(err){
res.end();
});
});
现在,在写入过程完成后将调用res.end()函数。
答案 2 :(得分:0)
在我做了两处修改后,它起了作用:
var query = connection.query('Select * from ?? where Lable = ?', [search, term], function(err, rows) {
console.log(rows);
res.write(JSON.stringify(rows));
res.end();
});
首先,我将res.end();
移到了connection.query
部分。
其次,我没有写rows
,而是改为res.write(JSON.stringify(rows));