2017-04-25 15 views
0

NodeJSアプリからJava Jersey 2.0 APIバックエンドにマルチパートリクエストを行うためにrequest-promise npm libを使用しています。 requestform-data libを使用して呼び出しを行うため、文字列、バッファ、ストリームのみを送信できることがわかります。 Javaのバックエンド側でJSONオブジェクトをストリーム化してストリームとして送信する[NodeJS]

、私は@FormDataParam sとPOJOのオブジェクトを期待しています:

@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データを含むファイルとして送信していたので、目的の動作をシミュレートできました。ジャージー/ジャクソンはこれを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) 

答えて

0

あなたが「Multer」を使用することを忘れNodeJsいけないでファイルを処理するために、Expressを使用している場合明示的にファイルを扱うために使用されるエクスプレスモジュール(Expressから削除されました)

+0

申し訳ありませんが、それは有効な点ですが、どうにかストリーミングを行う方法は? – greengold

関連する問題