Ошибка Meteor-CollectionFS createReadStream (): для FS.Utility.safeStream требуется поток NodeJS - PullRequest
0 голосов
/ 04 мая 2020

Репо архивируется, и когда я пытаюсь написать инструмент миграции, я обнаруживаю, что не могу получить файлы, хранящиеся с Meteor-CollectionFS.

API говорит, что я могу использовать fs.createReadStream(), чтобы получить файл, но когда я делаю это на работающей базе данных, я получаю эту ошибку:

Error: FS.Utility.safeStream requires a NodeJS Stream
    at Object.FS.Utility.safeStream (packages/cfs_base-package.js:418:11)
    at Object.self.adapter.createReadStream (packages/cfs_storage-adapter.js:114:23)
    at FS.File.createReadStream (packages/cfs_file.js:833:30)
    at CFSAttachments.find.forEach.file (server/migrations.js:1049:24)
    at SynchronousCursor.forEach (packages/mongo/mongo_driver.js:1107:16)
    at Cursor.(anonymous function) [as forEach] (packages/mongo/mongo_driver.js:887:44)
    at Object.Migrations.add [as migrationCallback] (server/migrations.js:1047:24)
    at packages/idmontie_migrations.js:238:17
    at Function.time (/programs/server/profile.js:273:30)
    at /programs/server/boot.js:412:15
    at /programs/server/boot.js:462:7
    at Function.run (/programs/server/profile.js:280:14)
    at /programs/server/boot.js:460:13
** HTTP-BRIDGE: App server exited with status code: 1

Я совершенно не представляю, как это может произойти. Я пытаюсь перенести зерно wekan в систему песчаных бурь. Может кто-нибудь помочь или дать мне обходной путь для извлечения файла, хранящегося в mongoDB? Спасибо.

1 Ответ

0 голосов
/ 05 мая 2020

Как упоминал @Jankapunkt, я могу просто получить данные из системы MongoDB gridFS, например:

  import { MongoInternals } from 'meteor/mongo';

  const http = require('http');
  const fs = require('fs');
  CFSAttachments.find().forEach(file => {
    const bucket = new MongoInternals.NpmModule.GridFSBucket(
       MongoInternals.defaultRemoteCollectionDriver().mongo.db, 
       {bucketName: 'cfs_gridfs.attachments'}
    );
    const gfsId = new MongoInternals.NpmModule.ObjectID(file.copies.attachments.key);
    const reader = bucket.openDownloadStream(gfsId);
    const path = `/var/attachments/${file.name()}`;
    const fd = fs.createWriteStream(path);
    reader.pipe(fd);
    Attachments.addFile(path, opts, (err, fileRef) => {
      if (err) {
        console.log('error when migrating ', fileName, err);
      } else {
        file.remove();
      }
    });
  });

...