Как вернуть поток из gridFS на электрон? - PullRequest
0 голосов
/ 05 декабря 2018

Я работаю над проектом CMS для небольшого офиса.Владелец хочет, чтобы приложение было приложением desctop ?.Это не проблема, потому что у нас есть Электрон?.В офисе много работы для клиентов, и им сложно обмениваться файлами с одного компьютера на другой.Большинство документов в формате PDF, но есть и изображения.Я использую Vue.js для пользовательского интерфейса и mongoDB для бэкэнда.

1st.Я подключаюсь к mongDB в процессе рендеринга, а не в основном.(Я не знаю, если это нормально).Второй.Я не уверен, что мне нужна gridFS.Размеры файлов не очень большие (не всегда).Третий.Я использую mongoose для своих моделей и mongoose не поддерживает gridFS.Не большая проблема.

Во всяком случае.Я успешно загрузил свои файлы в mongoDB в стиле gridFS.Я запрашиваю коллекцию чанков без проблем.Но потоки звучат гречески для меня, и я грек.Большая драма.

Как правильно читать readStreams?

Вот фрагмент кода, чтобы посмотреть.Любая помощь будет очень цениться.

// renderer.js

const mongoose = require('mongoose')
const { remote } = require('electron')
const { GridFSBucket } = require('mongodb')
const { dialog, BrowserWindow } = remote

let bucket = null
const connection = mongoose.connection
connection.on('connected', () => console.log('DB_Info: Connection establish. '));
connection.on('error', (error) => console.log('DB_Error: ', error))
connection.once('open', function onConnectionOpen() {
  console.log('DB_Info: Database connection open.')
  const db = connection.db
  bucket = new GridFSBucket(db, { bucketName: 'files' })
  
  // get the uploaded files from the gridFS files.collection
  db.collection('files.files').find().toArray((err, docs) => {
    if(err) return console.log('Files_Coll_Error: ', err)
    if(!docs) return;
    
    docs.forEach(doc => {
      db.collection('files.chunks').findOne({files_id: doc._id})
        .then(file => { console.log(file) })
        
      // Here somehow I have to read the stream. But How???
      // and the consept is to display them in the output div
      //* (EDIT) older docs of mongDB 2.1 have code samples *//
      let gotData = 0
      let str = ''
      bucket.openDownloadStream(doc._id)
        .on('close', (data) => console.log('StreamClose: ', data))
        .on('data', (buffer) => {
          console.log('streamBuffer: ', buffer)
          ++gotData;
          str += buffer.toString('utf8');
        })
        .on('end', () => {
          console.log('streamEnd: ')
          console.log(gotData)
          console.log(str)  
        })
        .on('error', (err) => console.log('streamError: ', err))
        .on('file', (file) => console.log('streamFile', file))
  
      // The onData event return the file buffer. Now what?
  })
})

const db_uri = 'mongodb://localhost:27017/gridFS_test'
mongoose.connect(db_uri, { useNewUrlParser: true });

const currentWindow = BrowserWindow.getFocusedWindow()
const button = document.getElementById('ufa')
button.onclick = function uploadFileAction() {

  // Open file dialog so user can select the files to upload.
  dialog.showOpenDialog(currentWindow, {
    title: 'Choose The Files To Upload',
    properties: [ 'openFile', 'multiSelections' ]
  }, (filePaths) => {
    if(!filePaths) 
      return console.log('User didn\'t select any files. Return')

    filePaths.forEach((filePath, index) => {
    
      const fileName = path.basename(filePath)    
      const readStream = fs.createReadStream(filePath)
      
      const uploadStream = 
          bucket.openUploadStream(`${ Date.now() }`, {})
          .once('finish', () => { console.log('file uploaded..') })
          .on('error', () => console.log('Upload_Stream_Error: ', error))

      readStream.pipe(uploadStream)
    })
  })
}
<button id="ufa">upload File</button>
<div id="output"></div>
...