Я пытаюсь передать произвольно большой объем данных по HTTP из подпроцесса, используя node. Мой полный код находится здесь, и основной фрагмент:
res.writeHead(200, {
'Content-Type': 'application/octet-stream',
'Content-Disposition': 'attachment;filename=osm_export_' +
((north + south) / 2) + '_' + ((east + west) / 2) + '.pbf'
});
// run vex
var proc = spawn(cmd, [dbname, south, west, north, east, '-']);
// stream chunks
proc.stdout.pipe(res);
Приблизительно после 40 МБ (где-то между 40 000 000 и 42 000 000 байт) поток прерывается, и запрос никогда не завершается. Я не могу установить заголовок Content-Length
, потому что я не знаю, сколько данных будет производить команда, пока она не будет выполнена. Мне интересно, не является ли это опустошением буфера; рассматриваемая команда извлекает данные из базы данных и записывает поток, который может быть медленнее, чем соединение между моим компьютером и моим сервером. Я подозреваю это, потому что я заменил код на это:
var http = require('http');
var spawn = require('child_process').spawn;
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'application/octet-stream'});
var proc = spawn('head', ['-c', '500000000', '/dev/zero']);
proc.stdout.pipe(res);
}).listen(8181, '127.0.0.1');
Который передает 500 МБ нулевых данных, и все работало нормально. Есть ли какой-то тайм-аут и т. Д., Который мне нужно установить?
2 ответа
А, нашел проблему. Это может или не может быть полезным для других. Я ничего не делал с потоком процесса stderr
, а внутренний процесс записывает много информации о состоянии в stderr. Буфер внутри узла где-то заполнялся, а затем он давал сбой. Изменение строки создания процесса на
var proc = spawn(cmd, [dbname, south, west, north, east, '-'], {stdio: ['ignore', 'pipe', 'ignore']});
Решил проблему. Спасибо всем, кто помог!
Попробуйте настроить заголовок HTTP Content-Length
и установить его значение в соответствии с размером данных, которые вы используете в ответе.
Похожие вопросы
Связанные вопросы
Новые вопросы
node.js
Node.js — это основанная на событиях, неблокирующая, асинхронная среда выполнения ввода-вывода, использующая движок Google V8 JavaScript и библиотеку libuv. Он используется для разработки приложений, которые интенсивно используют возможность запуска JavaScript как на стороне клиента, так и на стороне сервера и, следовательно, выигрывают от возможности повторного использования кода и отсутствия переключения контекста.