Проблема с сохранением файлов MongoDB GridFS с помощью Node.JS

У меня есть функция сохранения файла в gridfs. Он каким-то образом перестал работать спорадически после рефакторинга, и я провел более 2 часов, тупо глядя на него. Клянусь, это примерно то же самое, что и было. Кажется, я помню, что сначала он не работал, прежде чем я добавил близко, затем он начал работать, но это может быть бессонница. По сути, проблема заключается в том, что в коллекции db.fs.files нет записей, но фрагменты добавляются в db.fs.chunks.

данные — это буфер, загруженный с диска через fs.readFile().

 31    var gs = new mongodb.GridStore(this.db, filename, "w", {
 32        "chunk_size": 1024*4,
 33        metadata: {
 34          hashpath:gridfs_name,
 35          hash:hash,
 36          name: name
 39        }
 40    });
 41    gs.open(function(err,store) {
 42       gs.write(data,function(err,chunk) {
 43          //cb(err,hash,chunk);
 44          //self.close();
 45       });
 46    });

person Justin Thomas    schedule 04.08.2011    source источник


Ответы (1)


Есть несколько решений. Вы можете использовать writeBuffer, writeFile или новый простой класс сетки. В вашем примере скорректирован факт использования экземпляра буфера.

// You can use an object id as well as filename now
var gs = new mongodb.GridStore(this.db, filename, "w", {
  "chunk_size": 1024*4,
  metadata: {
    hashpath:gridfs_name,
    hash:hash,
    name: name
  }
});

gs.open(function(err,store) {
  // Write data and automatically close on finished write
  gs.writeBuffer(data, true, function(err,chunk) {
    // Each file has an md5 in the file structure
    cb(err,hash,chunk);
  });
});

В общем, лучше всего начать с тестов, которые охватывают широкий профиль использования классов gridfs. Смотреть на.

https://github.com/christkv/node-mongodb-native/tree/master/test/gridstore

person christkv    schedule 04.08.2011
comment
На самом деле это все еще не сохраняет файл в fs.files, хотя коллекция создается, а фрагменты все еще сохраняются. Я не могу найти файл после его записи. Это бесит :( - person Justin Thomas; 04.08.2011
comment
Он не записывает, если close() не находится в обратном вызове writeBuffer. - person Justin Thomas; 05.08.2011