ファイルのアップロードを Mongo に直接ストリーミングしようとしています。gridform ( https://github.com/aheckmann/gridform ) は、これに対する優れたソリューションのようです。
私はすでに Express フレームワークを使用しており、その機能が気に入っているので使い続けたいと思っていますが、gridform の使用例は Express を使用しないネイティブの HTTP サーバーに基づいているようです。
Express.bodyParser() が gridform と競合することがわかったので、代わりに:
app.use(express.bodyParser()); 私は app.use(express.json()); を使用しています。app.use(express.urlencoded());
私を混乱させているのは、ルート内でグリッドフォームを使用する方法です。app.post('/data/AddPropertyImage', db.addPropertyImage);
exports.addPropertyImage = function(req, res){ ??? }
var form = gridform(); から有効なインスタンスを取得できないように見えるかもしれませんが、試してみてください。このアサーションは失敗し続けます。assert (formidable.IncomingForm のフォームインスタンス);
これは完全なコード セグメントです。
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');
};
編集...
以下に述べるように、特定のバージョンの formidable var formidable = require('gridform/node_modules/formidable'); を使用する必要がありました。
アサーションはパスするようになりましたが、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');