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