2013-06-23 4 views
0

Mongo에 파일 업로드를 직접 스트리밍하려고합니다. 그것은 gridform (https://github.com/aheckmann/gridform)이 이것을위한 훌륭한 해결책 인 것 같습니다. 이미 명시 프레임 워크를 사용하고 그래서 무엇을하고 있는지 사랑하고node.js gridform + express

그것을 계속 사용하려는, 그러나 gridform의 사용 예는 명시하지 않고 네이티브 HTTP 서버를 기반으로 보인다.

내가 찾은 그 express.bodyParser() gridform와 충돌, 그래서 대신 :

app.use (express.bodyParser()); 내가 사용하고 있습니다 app.use (express.json()); app.use (express.urlencoded());

나를 혼란스럽게하는 부분은 현재 내 경로에서 어떻게 그리드 폼을 사용하는지입니다. app.post ('/ data/AddPropertyImage', db.addPropertyImage);

exports.addPropertyImage = 함수 (REQ, 입술) { ??? }

시도해보십시오. 유효한 인스턴스를 가져올 수 없습니다. var form = gridform(); 이 어설 션은 계속 실패합니다. 어설 션 (form instanceof formidable.IncomingForm);

이것은 전체 코드입니다. 내가 요구하는 강력한 VAR 강력한 =의 특정 버전 ('gridform/node_modules/강력한') 사용하는 데 필요한 아래에 언급 한 바와 같이

exports.addPropertyImage = function(req, res){ 

    var mongo = require('mongodb') 
    var formidable = require('formidable'); 
    var assert = require('assert'); 

    var Db = require('mongodb').Db; 
    var Server = require('mongodb').Server; 
    var MongoDb = new Db('test', new Server('localhost', 27017), {w: 1}); 

    MongoDb.open(function(err, db) { 
     var gridform = require('gridform'); 
     gridform.db = db; 
     gridform.mongo = mongo; 
     var form = gridform(); 

     // returns a custom IncomingForm 
     assert(form instanceof formidable.IncomingForm); 
     // this returns AssertionError: false == true 
    }); 

    res.send('test'); 
}; 

편집 ...

;

이제 어설 션이 완료되었지만 form.parse()가 실행되지 않는 것 같습니다. 그래서 console.log ('start parse'); 아래 라인은 절대로 안타깝습니다.

console.log('start'); 
    var mongo = require('mongodb') 
    //var formidable = require('formidable'); 
    var formidable = require('gridform/node_modules/formidable'); 
    var gridfsStream = require('gridform/node_modules/gridfs-stream'); 
    console.log(gridfsStream); 
    var assert = require('assert'); 

    var Db = require('mongodb').Db; 
    var Server = require('mongodb').Server; 
    var MongoDb = new Db('test', new Server('localhost', 27017), {w: 1}); 

    console.log('mongo open'); 
    MongoDb.open(function(err, db) { 
     var gridform = require('gridform'); 
     gridform.db = db; 
     gridform.mongo = mongo; 
     var form = gridform(); 

     // returns a custom IncomingForm 
     assert(form instanceof formidable.IncomingForm); 
     // this returns AssertionError: false == true 
     console.log('assert passed'); 

     // optionally store per-file metadata 
     form.on('fileBegin', function (name, file) { 
      console.log('mmmeta'); 
      file.metadata = 'so meta' 
     }) 

     // parse normally 
     form.parse(req, function (err, fields, files) { 
      console.log('start parse'); 
      // use files and fields as you do today 
      var file = files.inpFile1; 
      console.log(file); 
      file.name // the uploaded file name 
      file.type // file type per [mime](https://github.com/bentomas/node-mime) 
      file.size // uploaded file size (file length in GridFS) named "size" for compatibility 
      file.path // same as file.name. included for compatibility 
      file.lastModified // included for compatibility 

      // files contain additional gridfs info 
      file.root // the root of the files collection used in MongoDB ('fs' here means the full collection in mongo is named 'fs.files') 
      file.id // the ObjectId for this file 

     }); 
    }); 

    res.send('test'); 

답변

3

gridformformidable (1.0.11)의 특정 버전을 사용한다. 해당 특정 버전이 아직 설치되지 않은 경우 (npm repo의 최신 버전은 1.0.14 임) gridform 모듈 (./node_modules/gridform/node_modules/)과 관련된 종속성으로 설치됩니다.

즉, 해당 특정 모듈을 사용하지 않으면 을 사용하여 가져온 모듈과 다른 모듈에서 form이 상속되기 때문에 어설 션이 실패합니다.

var formidable = require('gridform/node_modules/formidable'); 
+0

정말 감사 :이 문제를 해결하려면

gridform에서 사용하는 버전이 필요합니다. 나는 벽에 머리를 치고 있었다. 그것은 작동하지만 form.parse() 메서드는 여전히 내가 제공 한 함수를 입력하는 것처럼 보입니다. 내 질문을 그대로 코드로 업데이트하겠다. 다시 도움을 청한다. –

+1

@WarrickFitzGerald는'res.send()'픽스를 제거합니까? 실제로 처리 할 양식 처리 (비동기식)를 기다리지 않고 응답을 보냅니다. – robertklep

+0

아, 그래, 그게 도움이 ... 많이 :). 그래서 res.send()를 parse() 메소드의 맨 아래로 움직이면 "보이는 것"으로 작동합니다. 나는 Mongo에서 항목을 얻지 만, 그들은 부패한 것처럼 보이거나 그릇된 점이있는 것 같다. MongoVUE를 통해 이미지를 열려고하면 다음 오류가 반환됩니다. 파일을 여는 동안 오류가 발생했습니다. 'MongoDB.Bson.BsonString'유형의 오브젝트를 MongoDB.Bson 유형으로 3 스트 할 수 없습니다.BsonDocument '. –