【问题标题】:streamify JSON object and send it as stream [NodeJS]流化 JSON 对象并将其作为流发送 [NodeJS]
【发布时间】:2017-04-25 10:24:44
【问题描述】:

我正在使用 request-promise npm lib 从 NodeJS 应用程序向 Java Jersey 2.0 API 后端发出多部分请求。由于request 使用form-data lib 进行调用,我看到它只能发送字符串、缓冲区和流。

在 java 后端,我期望 POJO 对象为 a@FormDataParams:

@GET
@ApiOperation(
        value = "Gets party metadata by party_id",
        notes = "Gets party metadata by party_id"
)
@ApiResponses(value = {
        @ApiResponse(code = 200, message = "metadata")
})
@Path("party")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.MULTIPART_FORM_DATA)
public Metadata getByPartyId(
        @ApiParam(value = "partyId", required = true) @NotNull @QueryParam("partyId") String partyId,
        @ApiParam(value = "party metadata", required = true) @FormDataParam("metadata") Metadata metadata

) {
    return folderCtrl.getByPartyId(partyId);
}

有一些端点,我什至等待多个 POJO 对象的到来,并且我正在使用注释验证机制在接收到端点时验证它们。 到目前为止,我能够模拟所需的行为,因为我将这些 POJO 作为包含 JSON 数据的文件发送。 Jersey/Jackson 能够将其转换为 POJO 并继续其生命周期...

现在,我需要从 NodeJS 调用这些端点。 因此,我知道form-data 可以发送什么,我想我需要一个选项来将 JSON 对象转换为流并像之前的场景一样发送它以接收 POJO 对象。

所以我的问题是,如何在 NodeJS 中“流化”对象并使用 request-promise 发送它们?

这就是我现在拥有的:

'use strict';

var rp = require('request-promise');
var express = require('express');
var fs = require('fs');
var metaJson = require(__dirname + '/attachments/metadata.json');

var router = express.Router();

const Readable = require('readable-stream').Readable;

const stream = Readable({objectMode: true});
stream._read = () => {};

const PROTOCOL = 'http://';
const HOST = 'localhost:';
const PORT = 8080;

// define the home page route
router.get('/', async function (req, res) {

    stream.push(metaJson);

    const options = {
        method: req.method,
        json: true,
        baseUrl: PROTOCOL + HOST + PORT,
        uri: req.originalUrl,
        qs: {
            partyId: "qwer"
        },
        formData: {
            metadata: stream
        },
    };
      try {
          const response = await rp(options);
      } catch (err) {
          console.log(err);
      }


    res.send('foo res');
});

但最终会出现此错误:

    _http_outgoing.js:502
    throw new TypeError('First argument must be a string or Buffer');
    ^

TypeError: First argument must be a string or Buffer
    at ClientRequest.write (_http_outgoing.js:502:11)
    at Request.write (/home/tepo/IdeaProjects/rig/node_modules/request/request.js:1514:27)
    at FormData.ondata (internal/streams/legacy.js:16:26)
    at emitOne (events.js:96:13)
    at FormData.emit (events.js:191:7)
    at FormData.CombinedStream.write (/home/tepo/IdeaProjects/rig/node_modules/combined-stream/lib/combined_stream.js:118:8)
    at DelayedStream.ondata (internal/streams/legacy.js:16:26)
    at emitOne (events.js:96:13)
    at DelayedStream.emit (events.js:191:7)
    at DelayedStream._handleEmit (/home/tepo/IdeaProjects/rig/node_modules/delayed-stream/lib/delayed_stream.js:82:15)
    at Readable.source.emit (/home/tepo/IdeaProjects/rig/node_modules/delayed-stream/lib/delayed_stream.js:29:19)
    at Readable.read (/home/tepo/IdeaProjects/rig/node_modules/readable-stream/lib/_stream_readable.js:386:26)
    at flow (/home/tepo/IdeaProjects/rig/node_modules/readable-stream/lib/_stream_readable.js:734:34)
    at resume_ (/home/tepo/IdeaProjects/rig/node_modules/readable-stream/lib/_stream_readable.js:717:3)
    at _combinedTickCallback (internal/process/next_tick.js:80:11)
    at process._tickCallback (internal/process/next_tick.js:104:9)

【问题讨论】:

    标签: java json node.js streaming multipartform-data


    【解决方案1】:

    当您在 NodeJs 中使用 Express 处理文件时,不要忘记使用“Multer”模块(已从 Express 中删除)用于处理 express 文件

    【讨论】:

    • 好吧,这是一个有效的观点,但无论如何要如何进行流化?
    猜你喜欢
    • 2018-07-07
    • 2015-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-21
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    相关资源
    最近更新 更多