在我的应用中,我向服务器发送包含CSV文件的数据的发布请求:
$.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
});
});
注意:我正在发布到主路由,并且我能够获得从服务器转换的数据的响应。问题是无论我是在localhost还是Heroku上运行,我只能触发一次POST请求,然后我必须重新启动服务器(即使我刷新页面)。所以我知道问题在于我的路线:
更新包含完整服务器文件:
'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}`);
});
我正在使用Express 4.再次,一切正常,但只有一次。当我运行Heroku日志,或检查localhost上的控制台时,我得到:
Error: Can't set headers after they are sent.
但我不明白我是如何重新设置它们的。 如果想在localhost上运行,这里有一个指向项目github的链接:https://github.com/qctimes/calendar_export
答案 0 :(得分:1)
您应该在converter
回调方法中移动app.post
实例化。这样它就会在每次请求时实例化一个新对象。
这就是您的代码应该如何:
'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}`);
});