2016-03-22 2 views
0

В следующем коде я пытаюсь извлечь данные из базы данных MySQL и показать их пользователю, используя ответную запись. Ошибка, что я получил это Error: write after end:Узел JS Ошибка: напишите после конца

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

Ваш вызов в базе данных асинхронный. Вы вызываете 'end()' перед тем, как попытаетесь написать. – Antiga

ответ

2

Проблема заключается в том, что запросы MySQL асинхронны в node.js. поэтому результат не будет в переменном запросе, а получен в обратном вызове переменным строкам. Так происходит то, что вызывается res.end(), а затем возвращается обратный вызов и вызывается res.write(), поэтому он вызывается после end().

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

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() вызывается после того, как был выполнен процесс записи.