2016-10-18 4 views
0

In meiner app, ich sende einen Beitrag Anfrage an den Server mit Daten, die eine CSV-Datei mit:Kann nicht Express verwenden, um Daten zu senden zurück mehr an den Client als einmal

$.ajax({ 
    type:"POST", 
    contentType: "application/json", 
    url:"/", 
    data: JSON.stringify({fileData:My_CSV_FILE}), 
    success: function(csvJson) { 
    console.log('in the done block!'); 
    //can use csvJson in this handler 
    }); 
}); 

Anmerkung: Ich bin Entsendung zu die Heimroute, und ich bin in der Lage, eine Antwort mit den vom Server konvertierten Daten zu bekommen. Das Problem ist, dass ich, wenn ich auf localhost oder Heroku laufe, die POST-Anfrage nur einmal auslösen kann, dann muss ich den Server neu starten (auch wenn ich die Seite aktualisiere). Also ich kenne das Problem mit meiner Route irgendwo ist:

aktualisierenden FULL SERVER-Datei enthalten:

'use strict'; 
const express = require('express'); 
const csvtojson = require('csvtojson'); 
const PORT = process.env.PORT || 3000; 
const bodyParser = require('body-parser'); 
const Converter = require('csvtojson').Converter; 

var converter = new Converter({}); 
let app = express(); 

app.use(bodyParser.json({limit: '300kb'})); 

app.use(express.static(__dirname +'/public')); 

app.post('/',function(req,res) { 
    var csvFile = (req.body.fileData); 
    converter.fromString(csvFile, function(err, result) { 
    if(!err) { 
     console.log(result); 
     res.json(result); 
    }else { 
     res.json({error: 'Could not convert'}); 
    } 
    }) 
}); 

app.listen(PORT,() => { 
    console.log(`app listening on port ${PORT}`); 
}); 

Ich verwende Express 4. Auch hier alles funktioniert, aber nur einmal. Wenn ich Heroku Protokolle laufen oder auf der Konsole auf localhost ich:

Error: Can't set headers after they are sent. 

Aber ich verstehe nicht, wie ich sie wieder einstellen. Wenn auf localhost laufen will, hier ist ein Link zu den Projekten Github: https://github.com/qctimes/calendar_export

+0

Es gibt wahrscheinlich mehr Code, den Sie uns nicht angezeigt wird, zum Beispiel, wo die csvtojson Middleware enthalten? Irgendwie senden Sie Header, nachdem Sie mit dem Rendern begonnen haben. – adeneo

+0

@adeneo Ich aktualisierte den Inhalt, um die vollständige Datei und den Link zum Projekt zu enthalten – Michael

+0

Ich kann wirklich keine Fehler erkennen? Der Fehler ist ein Klassiker, und wie oben erwähnt, bedeutet das, dass Sie versuchen, Header nach dem Senden festzulegen, und Sie haben damit begonnen, Inhalte auszugeben. Kann es sein, dass der 'fromString'-Callback mehrmals oder so ähnlich läuft? Ersetzen Sie einfach 'res.json()' durch 'res.send()' und sehen Sie, was passiert – adeneo

Antwort

1

Sie sollen die converter Instanziierung bewegen innerhalb der app.post Callback-Methode durchgeführt werden. Auf diese Weise wird bei jeder Anfrage ein neues Objekt instanziiert.

Dies ist, wie Ihr Code sein sollte:

'use strict'; 
const express = require('express'); 
const csvtojson = require('csvtojson'); 
const PORT = process.env.PORT || 3000; 
const bodyParser = require('body-parser'); 
const Converter = require('csvtojson').Converter; 

let app = express(); 

app.use(bodyParser.json({limit: '300kb'})); 

app.use(express.static(__dirname +'/public')); 

app.post('/',function(req,res) { 
    var csvFile = (req.body.fileData); 
    var converter = new Converter({}); // instantiation is done here 
    converter.fromString(csvFile, function(err, result) { 

    if(!err) { 
     console.log(result); 
     res.send(result); 
    }else { 
     res.send({error: 'Could not convert'}); 
    } 
    }); 
}); 

app.listen(PORT,() => { 
    console.log(`app listening on port ${PORT}`); 
}); 
Verwandte Themen