streams一般来说,我仍然试图改变自己的方式.我已经能够从内部使用multiparty流式传输大型文件form.on('part').但我需要推迟调用并在读取之前解析流.我曾尝试PassThrough,through.through2,但已经得到了不同的结果,它主要挂起,我无法弄清楚该怎么做,也没有步骤调试.我对所有选择都持开放态度.感谢您的所有见解.
import multiparty from 'multiparty'
import {
PassThrough
} from 'stream';
import through from 'through'
import through2 from 'through2'
export function promisedMultiparty(req) {
return new Promise((resolve, reject) => {
const form = new multiparty.Form()
const form_files = []
let q_str = ''
form.on('field', (fieldname, value) => {
if (value) q_str = appendQStr(fieldname, value, q_str)
})
form.on('part', async (part) => {
if (part.filename) {
const pass1 = new PassThrough() // …Run Code Online (Sandbox Code Playgroud) 我正在尝试将数据从我的节点应用程序发送到第 3 方 HTTP 端点。
我正在使用多方模块解析来自客户端的请求对象上的数据,并通过请求模块发送数据。我收到错误
错误:uncaughtException:source.on 不是函数
var request = require('request');
const multiparty = require('multiparty');
function addAttachment(req, res) {
let form = new multiparty.Form();
let parsedFile = {};
const formData = {};
form.parse(req, function(err, fields, files){
Object.keys(fields).forEach(function(name) {
formData[name] = fields[name][0];
});
Object.keys(files).forEach(function(name) {
logger.debug(name);
parsedFile[name] = files[name][0];
});
formData.uploadFile = parsedFile.uploadFile;
logger.debug('formData ', formData);
reqOptions.url = imageURL;
reqOptions.formData = formData;
logger.debug('REQ_OPTIONS ', reqOptions);
request.post(reqOptions, function (err, response, body) {
if (err) {
logger.warn(req, ' Error sending attachment', err); …Run Code Online (Sandbox Code Playgroud) 我的快递服务器接收来自浏览器的文件上传。上传作为multipart/form-data请求传输;我使用多方来解析传入的实体主体。
Multiparty 允许您将一部分(粗略地说,单个表单字段,如<input type="file">)作为可读流。我不想在我的 Web 服务器上处理或存储上传的文件,所以我只是将上传的文件部分通过管道传输到另一个服务的请求中(使用请求模块)。
app.post('/upload', function(req, res) {
var form = new multiparty.Form();
form.on('part', function(part) {
var serviceRequest = request({
method: 'POST',
url: 'http://other-service/process-file',
headers: {
'Content-Type': 'application/octet-stream'
}
}, function(err, svcres, body) {
// handle response
});
part.pipe(serviceRequest);
});
form.parse(req);
});
Run Code Online (Sandbox Code Playgroud)
这在大多数情况下都能正常工作。node 自动应用分块传输编码,当浏览器上传文件字节时,它们作为原始实体主体(没有多部分格式)正确发送到后端服务,最终获取完整文件并成功返回。
但是,有时请求会失败并且我的回调会被调用err:
TypeError: The header content contains invalid characters
at ClientRequest.OutgoingMessage.setHeader (_http_outgoing.js:360:11)
at new ClientRequest (_http_client.js:85:14)
at Object.exports.request (http.js:31:10)
at Object.exports.request (https.js:199:15)
at Request.start (/app/node_modules/request/request.js:744:32) …Run Code Online (Sandbox Code Playgroud) 我承诺多方使用它的 form.parse。它工作正常,但 form.parse 不会返回我可以使用的 then/catch 值的承诺。
var Promise = require('bluebird');
var multiparty = Promise.promisifyAll(require('multiparty'), {multiArgs:true})
var form = new multiparty.Form();
form.parse({}).then((data)=>{console.log(data)});
Run Code Online (Sandbox Code Playgroud) multiparty ×4
node.js ×3
bluebird ×1
express ×1
javascript ×1
node-request ×1
node-streams ×1
promise ×1
requestjs ×1
through2 ×1