2017-04-25 4 views
0

NodeJS 앱에서 Java Jersey 2.0 API 백엔드로 멀티 파트 요청을 만들기 위해 request-promise npm lib를 사용하고 있습니다. requestform-data lib를 사용하여 호출을하기 때문에 문자열, 버퍼 및 스트림 만 보낼 수 있음을 알았습니다. 자바 백엔드 측면에서 JSON 객체를 스트리밍하여 스트림으로 전송 [NodeJS]

, 나는 @FormDataParam들로 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 데이터가 들어있는 파일로 보내므로 원하는 동작을 시뮬레이션 할 수있었습니다. Jersey/Jackson은이를 POJO로 변환하고 수명주기를 계속할 수있었습니다.

이제 NodeJS에서 이러한 끝점을 호출해야합니다. 그럼 그걸 가지고 무엇을 보낼 수 있는지 알고 있습니다. JSON 개체를 스트림으로 변환하고 이전 시나리오 에서처럼 POJO 개체를 받기 위해 보내는 옵션이 필요하다고 생각합니다.

내 질문은 NodeJS의 객체를 "스트리밍"하고 request-promise과 함께 전송하는 방법입니다. "Multer"를 사용하는 것을 잊지

_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

당신이 파일을 처리 할 수 ​​Express를 사용하는 NodeJs 청춘의 :

내가 지금 무엇을 가지고 :

'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'); 
}); 

하지만이 오류와 함께 종료입니다 익스프레스 용 파일을 처리하는 데 사용되는 모듈 (Express에서 제거되었습니다)

+0

괜찮 았지만, 어떻게해야할까요? – greengold