Запрос POST создает файл, за которым следует запрос GET для загрузки

Попытка сделать что-то, казалось бы, простое.

Я хотел бы создать запрос POST, через который я буду отправлять JSON. Эти JSON будут созданы в файлы, которые я хотел бы вернуть пользователю через загрузку.

Вариант использования для этого заключается в том, что я создаю приложение, которое принимает форму и преобразует ее в JSON для загрузки в базу данных MongoDB. Пользователи могут загрузить эти JSON в приложение, чтобы повторно загрузить свои старые записи в качестве шаблонов.

Вот как я приближаюсь к этому на данный момент:

// Download JSON Previews
var jsondownload = {};

// Grabs the JSON from POST request
app.post('/api/download', function(req, res, next){
    jsondownload = {};
    var json = req.body;
    jsondownload = json;
    res.json(jsondownload);
    next();
});

// Immediately downloads the JSON thereafter
app.get('/api/download', function(req, res){
    res.set({"Content-Disposition":"attachment; filename='test.json'"});
    res.send(jsondownload);
});

Как правильно это сделать?


person Ahmed Haque    schedule 01.12.2015    source источник
comment
@KevinB, спасибо за вклад. Я также беспокоился об этой проблеме состояния гонки. Я буду использовать предложенную вами стратегию, чтобы обойти это.   -  person Ahmed Haque    schedule 01.12.2015
comment
Я не совсем понимаю вариант использования здесь, и из-за этого я не могу порекомендовать, как вы должны его изменить. Как бы то ни было, он будет работать должным образом только для одного пользователя. Как только второй пользователь подключится, переменная jsondownload будет разделена между ними двумя, что приведет к конфликтам.   -  person Kevin B    schedule 01.12.2015


Ответы (1)


Не существует одного «правильного» способа сделать это, но есть несколько решений:

  1. Полностью удалите обработчик маршрута GET (и переменную jsondownload) и просто немедленно ответьте с соответствующим набором Content-Disposition. Это лучший из трех, потому что он уменьшает код и упрощает работу.

  2. Используйте простую переадресацию в обработчике маршрута POST. Вместо немедленного ответа в формате JSON вы должны сделать res.redirect('/api/download').

  3. Делайте более или менее то, что делаете сейчас, но переместите логику (res.set() и res.send()) в отдельную функцию, которая вызывается из обоих обработчиков маршрутов.

person mscdex    schedule 01.12.2015
comment
Спасибо за ответ. Я надеюсь, что вариант № 1 также был возможен, однако, когда я пытаюсь использовать: res.set({'Content-Disposition...) и res.send(...) в запросе POST - загрузка не запускается так же, как с запросом GET. Должен ли он работать одинаково между POST и get? - person Ahmed Haque; 01.12.2015
comment
Кажется, кто-то спрашивал что-то подобное, и ему также не очень повезло с загрузкой файлов из запросов POST stackoverflow.com/questions/29743395/ - person Ahmed Haque; 01.12.2015
comment
Это определенно возможно, я сам делал это раньше (отправить вложение ответа на запрос POST). Возможно, вам не хватает дополнительных заголовков или чего-то еще в зависимости от браузера. Попробуйте добавить несколько дополнительных заголовков, показанных здесь или здесь< /а>. Вы также можете попробовать изменить параметр filename, чтобы он не использовал одинарные/двойные кавычки. - person mscdex; 01.12.2015