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');
정말 감사 :이 문제를 해결하려면
는
gridform
에서 사용하는 버전이 필요합니다. 나는 벽에 머리를 치고 있었다. 그것은 작동하지만 form.parse() 메서드는 여전히 내가 제공 한 함수를 입력하는 것처럼 보입니다. 내 질문을 그대로 코드로 업데이트하겠다. 다시 도움을 청한다. –@WarrickFitzGerald는'res.send()'픽스를 제거합니까? 실제로 처리 할 양식 처리 (비동기식)를 기다리지 않고 응답을 보냅니다. – robertklep
아, 그래, 그게 도움이 ... 많이 :). 그래서 res.send()를 parse() 메소드의 맨 아래로 움직이면 "보이는 것"으로 작동합니다. 나는 Mongo에서 항목을 얻지 만, 그들은 부패한 것처럼 보이거나 그릇된 점이있는 것 같다. MongoVUE를 통해 이미지를 열려고하면 다음 오류가 반환됩니다. 파일을 여는 동안 오류가 발생했습니다. 'MongoDB.Bson.BsonString'유형의 오브젝트를 MongoDB.Bson 유형으로 3 스트 할 수 없습니다.BsonDocument '. –