节点JS错误:写完后

时间:2016-03-22 15:52:57

标签: mysql node.js

在下面的代码中,我试图从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);,但没有成功。有人可以帮我解决这个问题。

3 个答案:

答案 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));