2014-05-12 2 views
7

busboy-connect를 사용하여 req 객체의 multipart 양식 데이터에 액세스하는 간단한 방법이 필요합니다. Express 4를 사용하고 있습니다. Express 4는 이전에 내장 된 기능을위한 모듈을 필요로합니다.Busboy를 사용하여 Express 4 req.body 객체에 액세스하는 방법

내 경로에서 req.body 개체를 사용할 수 있지만 busboy.on ('field') 함수는 비동기이며 코드를 계속 진행하기 전에 모든 양식 데이터를 처리하지 않습니다.

multer이라는 busboy 상단에 내장 된 미들웨어 모듈이 있습니다. 라우트에 들어가기 전에 req.body 객체를 얻지 만, busboy.on ('file') 이벤트를 정의 할 수있는 기능을 무시합니다. 노선.

// App.js 

app.post(/users, function(req, res, next){ 

    var busboy = new Busboy({ headers: req.headers }); 

    // handle text field data (code taken from multer.js) 
    busboy.on('field', function(fieldname, val, valTruncated, keyTruncated) { 
    if (req.body.hasOwnProperty(fieldname)) { 
     if (Array.isArray(req.body[fieldname])) { 
     req.body[fieldname].push(val); 
     } else { 
     req.body[fieldname] = [req.body[fieldname], val]; 
     } 
    } else { 
     req.body[fieldname] = val; 
     console.log(req.body); 
    } 
    }); 

    busboy.on('file', function(fieldname, file, filename, encoding, mimetype) { 

    tmpUploadPath = path.join(__dirname, "uploads/", filename); 
    targetPath = path.join(__dirname, "userpics/", filename); 

    self.imageName = filename; 
    self.imageUrl = filename; 

    file.pipe(fs.createWriteStream(tmpUploadPath)); 
    }); 

    req.pipe(busboy); // start piping the data. 

    console.log(req.body) // outputs nothing, evaluated before busboy.on('field') 
         // has completed. 
}); 

UPDATE 연결할 때-웨이터을 사용하고 있습니다 :

여기 내 고장 코드입니다. 내 익스프레스 설정 파일에이 미들웨어 코드를 사용하여 내 경로 내의 req.body 객체에 대한 액세스 권한을 부여했습니다. 또한 내 경로에서 파일 업로드를 처리하고 req.busbuy.on ('end')에 액세스 할 수 있습니다.

// busboy middleware to grab req. post data for multipart submissions. 
app.use(busboy({ immediate: true })); 
app.use(function(req, res, next) { 
    req.busboy.on('field', function(fieldname, val) { 
    // console.log(fieldname, val); 
    req.body[fieldname] = val; 
    }); 

    req.busboy.on('finish', function(){ 
    next(); 
    }); 
}); 
+0

난 당신이 코드가 어떻게 작동하는지 설명 될까요 같은 문제가 있어요? 별도의 경로에서 처리되는 모든 요청이 있으며이 솔루션은 내 코드에서 작동하지 않습니다. 아마도 당신의 행동이 내 문제를 해결하는 데 도움이 될지에 대해 더 잘 이해한다면 어떨까요? 이것은 첫 번째 노드 프로젝트입니다. – Jeffpowrs

+0

@JeffPowers 필자는 생각했던 것처럼 미들웨어를 작동시키지 못했습니다. 필드를 구문 분석하고 필드 데이터로 무언가를 수행 한 다음 나중에 파일을 구문 분석 한 다음 busboy.on ("finish")을 호출하는 등 "다른"위치에서 들어오는 Multipart 데이터를 구문 분석하는 현재 솔루션은 없습니다. 내 게시물을 참조하십시오 : http : //programmers.stackexchange.com/questions/239170/how-to-parse-multipart-field-file-data-separately 알려 주시면 알려주세요. 나는 내 컨트롤러에 1 톤의 로직을 넣는 것을 끝내었다. 좋은 디자인 선택은 아니지만 포기했다. – Scott

+0

나는 같은 결론에 도달했다. 실제로 나는 멀더에 대한 버스 승무원을 바꾸었다 : https://github.com/expressjs/multer. 훨씬 더 간단했습니다. – Jeffpowrs

답변

9

를 추가해보십시오 :

busboy.on('finish', function() { 
    // use req.body 
}); 
+0

이것이 제가 필요한 단서였습니다. OP를 편집하여 솔루션을 반영했습니다. 미들웨어이지만 들어오는 게시물의 속도가 느려지지 않는다고 생각합니다. – Scott

+1

솔루션을'req.busboy.on ('finish', next)로 단축 할 수 있습니다. ' – mscdex

+0

다른 문제가 발생했습니다. 내 노드 앱 내에서 적절한 Separation of Concerns를 유지하려고합니다. 지금까지의 흐름은 다음과 같습니다. 1. app.js : 멀티 파트 데이터에서 req.body를 가져 오기 위해 명시 적으로 미들웨어를 설정합니다. 즉시 = true를 사용해야합니다. 2. routes.js :/post 경로를 정의하고 컨트롤러에 전달합니다. 3. controller.js : req.body 객체를 사용하여 데이터 형식을 지정하고 새 모델 객체를 만들고 model.save (req.body)를 호출하여 사진 업로드 프로세스를 시작합니다. 4. model.js : busboy + req.body 데이터를 사용하여 그림을 서버에 업로드합니다. 먼저 req.body를 처리 한 다음 파일 업로드 이벤트로 전달하는 방법이 있습니까? – Scott

관련 문제