无法使用Express多次将数据发送回客户端

时间:2016-10-18 18:06:20

标签: ajax node.js express heroku

在我的应用中,我向服务器发送包含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

1 个答案:

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