Не могу использовать Express для отправки данных обратно клиенту более одного раза

#ajax #node.js #express #heroku

#ajax #node.js #экспресс #heroku

Вопрос:

В моем приложении я отправляю post-запрос на сервер с данными, содержащими файл 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 или проверяю консоль на локальном хосте, я получаю:

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

Но я не понимаю, как я их перенастраиваю.
Если вы хотите работать на localhost, вот ссылка на github проектов: https://github.com/qctimes/calendar_export

Комментарии:

1. Вероятно, вы не показываете нам больше кода, например, где включено промежуточное программное обеспечение csvtojson? Каким-то образом вы отправляете заголовки после начала рендеринга.

2. @adeneo Я обновил содержимое, включив в него полный файл и ссылку на проект

3. Я действительно не могу обнаружить никаких ошибок? Ошибка является классической, и, как я отметил выше, это означает, что вы пытаетесь установить заголовки после их отправки, и вы начали вывод содержимого. Возможно, fromString обратный вызов выполняется несколько раз или что-то в этом роде? Попробуйте просто заменить res.json() на res.send() и посмотреть, что произойдет

4. @adeneo нет кубиков. :/

Ответ №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}`);
});