2017-09-27 14 views
0

파일과 json 데이터로 게시물 요청을받는 서비스가 있습니다. 나는 app.js에서 body-parser 패키지를 사용합니다. 파일을 "filer"서비스로 보내고 그 대답을 처리하고 싶지만 json 콘텐츠도 처리해야하고 파일러가 응답 한 후에 일부 작업을 수행해야하므로 요청을 파이프하고 싶지 않습니다.받은 파일을 저장하지 않고 보내고 익스프레스 js와 busboy로 파이프 보내기

const Busboy = require('busboy'); 
const request = require('request'); 

const sendFile = (req, file, callback) => { 
    return request.post({ 
    uri: 'http://localhost:5000/stream', 
    headers: req.headers, 
    formData: { value: file } 
    }, (err, resp, body) => { 
    if (err) return callback(err); 
    return callback(); 
    }); 
}; 

app.post('/route', (req, res, next) { 
    const busboy = new Busboy({ headers: req.headers }); 

    busboy.on('file', (fieldName, file) => { 
    file.on('error', err => reject(err)); 
    return sendFile(req, file, (err, link) => { 
     file.resume(); 
     if (err) return reject(err); 
    }); 
    }); 

    busboy.on('field', (fieldName, val) => { 
    // process the json here... 
    }); 

    busboy.on('finish',() => { 
    console.log('busboy.on(finish)'); 
    return next(); 
    }); 

    req.pipe(busboy); 
} 

다음 파일러 서비스 :

app.post('/stream', (req, res, next) => { 
    const busboy = new Busboy({ headers: req.headers }); 
    // here we are ok 
    busboy.on('file', function (fieldName, file, name) { 
    // but this part never run 
    res.send(200, { fileId: fileDoc._id }); 
    }); 

    return req.pipe(busboy); 
}); 

이 Unfortunatelly 파일러 서비스 대답하지, 내가 모른다는 어디에서 누락 된 부분입니다. file.resume()busboy.on('file') 안에 넣으려고했으나 도움이되지 않았습니다.

답변

0

아마도 busboy의 파일 스트림이 formData 요청으로 제대로 처리되지 않았기 때문일 수 있습니다.

또 다른 방법은 다음과 같습니다

  1. 임시 주요 서비스의 로컬 파일 스트림 쓰기
  2. 이 서비스를 파일러 해당 파일 및 파이프에서 스트림을 생성 (fs.createWriteStream 사용) (fs.createReadStream를 사용하여)..
  3. 주 서비스에서 수행해야하는 처리를 수행하십시오.
  4. 파일러 서비스의 응답을 기다리는 및 next()

당신이 필요하거나 다른 서비스에 파일을 보낼 경우에도 주요 서비스에서 파일을 사용할 수있는이 방법을 문의하십시오.

+0

로컬에 파일을 저장하지 않으려 고 시도합니다.이로드는 불필요합니다. 주로 파일에서 수정할 내용이 없기 때문입니다. – kree

+0

나는 busboy의 스트림 문제가 formdata에 사용된다고 생각합니다. requestjs에 대한 formData는 아마도 유효한 파일 스트림으로 인식하지 못하고 있습니다. 나는이 문제를 안고있다. 당신이 할 수있는 유일한 다른 방법은이 스트림을 파이프하여 직접 요청한 다음 close 이벤트 콜백을 요청하는 것입니다. –