Есть много сообщений о том, как обрабатывать запросы с данными из нескольких частей. Но мой вариант использования заключается в том, что у меня есть клиент, который ожидает от сервера ответ с данными из нескольких частей, и мне нужно написать простой сервер nodejs, чтобы протестировать моего клиента.

Чтобы написать простой сервер, у меня есть следующее:

var express = require('express');
var bodyParser = require('body-parser');
var FormData = require('form-data');

var app = express();

app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());


app.get('/describe', function(req, res) {
  var form = new FormData();
  form.append('part1', 'part 1 data');
  form.append('part2', 'part 2 data');
  res.setHeader('Content-Type', 'multipart/form-data');
  res.send(form);
});

app.listen(3030, "0.0.0.0");
console.log('Listening on port 3030...');

Теперь, когда мой клиент запрашивает localhost: 3030 / описать, заголовок ответа показывает следующее без граничного значения

Content-Type: multipart/form-data; charset=utf-8 

И контент загружается в виде файла, а не в теле ответа.

{"_overheadLength":208,"_valueLength":22,"_valuesToMeasure":[],"writable":false,"readable":true,"dataSize":0,"maxDataSize":2097152,"pauseStreams":true,"_released":false,"_streams":["----------------------------315683163006570790405079\r\nContent-Disposition: form-data; name=\"part1\"\r\n\r\n","part 1 data",null,"----------------------------315683163006570790405079\r\nContent-Disposition: form-data; name=\"part2\"\r\n\r\n","part 2 data",null],"_currentStream":null,"_boundary":"--------------------------315683163006570790405079"}

Итак, мои вопросы: 1. Как сделать так, чтобы граница отображалась в заголовке ответа? 2. как сделать так, чтобы содержимое ответа с данными формы отображалось в теле ответа вместо загружаемого файла?

2
Jing 15 Июн 2018 в 21:26

2 ответа

Лучший ответ

Чтобы отправить данные формы, вы захотите передать их по конвейеру (см. документацию ), вот так:

form.pipe(res);

Чтобы добавить границу в заголовок, вы можете сделать что-то вроде этого:

res.setHeader('Content-Type', 'multipart/form-data; boundary='+form.getBoundary());

Теперь о поле «Сохранить как». Браузер использует тип содержимого, чтобы выяснить, что делать с файлом. Поэтому, если вы хотите, чтобы он отображался в окне браузера, хорошим выбором будет text/plain (или, возможно, text/html, если это не сработает). Затем вы можете поместить свой multipart/form-data во что-то вроде x-content-type.

(Я предполагаю, что в конечном итоге вы будете использовать XHR или выборку, и в этот момент вы можете переключить content-type обратно. text/plain - это всего лишь временное решение для отображения данных в стандартный веб-браузер для тестирования.)

Собираем все вместе:

app.get('/describe', function(req, res) {
  var form = new FormData();
  form.append('part1', 'part 1 data');
  form.append('part2', 'part 2 data');
  res.setHeader('x-Content-Type', 'multipart/form-data; boundary='+form._boundary);
  res.setHeader('Content-Type', 'text/plain');
  form.pipe(res);
});
8
David784 16 Июн 2018 в 00:11

В моем случае это был POST-запрос, который был вызван веб-перехватчиком, и я использовал multer, тоже творит чудеса. Вот код.

const express = require('express');
const bodyParser = require('body-parser');
var multer = require('multer');
var upload = multer();
const app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));

app.post('/', upload.none(), function (req, res) {
  console.log("Data",req.body) 
  res.status(200).send('OK');
});

app.listen(port);
-1
otoloye 25 Июл 2020 в 05:59