2016-03-22 13 views
0

Im folgenden Code versuche ich Daten aus MySQL-Datenbank abrufen und sie einem Benutzer anzeigen, indem Antwort schreiben verwendet. Der Fehler, was ich habe ist Error: write after end:Node JS-Fehler: Schreiben nach Ende

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

ich res.write(rows);-res.end(rows); geändert, aber hat nicht funktioniert. Kann mir jemand helfen, dieses Problem zu lösen?

+0

Ihr Datenbankaufruf ist asynchron. Sie rufen 'end()' auf, bevor Sie versuchen zu schreiben. – Antiga

Antwort

2

Das Problem ist, dass MySQL-Abfragen in node.js asynchron sind. Das Ergebnis wird also nicht in der Variablenabfrage enthalten sein, sondern im Callback in den variablen Zeilen. Was passiert, ist, dass res.end() aufgerufen wird und dann der Callback zurückkehrt und res.write() aufgerufen wird, also nach end() aufgerufen wird.

0

Es funktionierte, nachdem ich zwei Änderungen vorgenommen:

var query = connection.query('Select * from ?? where Lable = ?', [search, term], function(err, rows) { 
     console.log(rows); 
     res.write(JSON.stringify(rows)); 
     res.end(); 
    }); 

Zuerst habe ich res.end(); innerhalb des connection.query Teil bewegt.

Zweitens statt rows nur zu schreiben, wechselte ich zu res.write(JSON.stringify(rows));

2

Sie einen asynchronen Aufruf zu tun, wenn sie von Datenbankdaten abgerufen werden. res.write() befindet sich innerhalb der Callback-Funktion, so dass vor dem Datenabruf res.end() aufgerufen wird und res.write() aufgerufen wird, nachdem die Daten abgerufen wurden. Deshalb erhalten Sie Error: write after end. Sie können res.end() in derselben Callback-Funktion verwenden.

var query = connection.query('Select * from ?? where Lable = ?', [search, term], function(err, rows) { 
      res.write(rows, function(err){ 
       res.end(); 
      }); 
    }); 

Jetzt wird die res.end() - Funktion aufgerufen, nachdem der Schreibvorgang abgeschlossen wurde.