2016-10-06 3 views
1

У меня возникла проблема с записью второго аудиофайла в gridfs. Я использую ng-file-upload для выбора файла, передачи файлов/двоичных данных в gridfs и записи его в базу данных. Первый файл работает отлично, однако если я не загружать другую точку зрения, а затем вернуться к моей точке зрения аудио/странице шаблона я получаю эту каждый раз ошибку:Почему я не могу написать второй файл в gridfs без обновления шаблона в приложении MEAN?

TypeError: path must be a string 
    at TypeError (native) 
    at Object.fs.open (fs.js:540:11) 
    at ReadStream.open (fs.js:1673:6) 
    at new ReadStream (fs.js:1660:10) 
    at Object.fs.createReadStream (fs.js:1608:10) 
    at NativeConnection.<anonymous> (Z:\techFilez\webApp\MyPiCloud\routes\IO\writeFile.js:42:29) 
    at NativeConnection.g (events.js:260:16) 
    at emitNone (events.js:67:13) 
    at NativeConnection.emit (events.js:166:7) 
    at open (Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\lib\connection.js:518:11) 
    at NativeConnection.Connection.onOpen (Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\lib\connection.js:527:5) 
    at Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\lib\connection.js:487:11 
    at Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\lib\drivers\node-mongodb-native\connection.js:71:5 
    at Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\node_modules\mongodb\lib\db.js:232:5 
    at connectHandler (Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\node_modules\mongodb\lib\server.js:333:7) 
    at g (events.js:260:16) 
Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\node_modules\mongodb\lib\server.js:336 
     process.nextTick(function() { throw err; }) 
            ^

TypeError: path must be a string 
    at TypeError (native) 
    at Object.fs.open (fs.js:540:11) 
    at ReadStream.open (fs.js:1673:6) 
    at new ReadStream (fs.js:1660:10) 
    at Object.fs.createReadStream (fs.js:1608:10) 
    at NativeConnection.<anonymous> (Z:\techFilez\webApp\MyPiCloud\routes\IO\writeFile.js:42:29) 
    at NativeConnection.g (events.js:260:16) 
    at emitNone (events.js:67:13) 
    at NativeConnection.emit (events.js:166:7) 
    at open (Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\lib\connection.js:518:11) 
    at NativeConnection.Connection.onOpen (Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\lib\connection.js:527:5) 
    at Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\lib\connection.js:487:11 
    at Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\lib\drivers\node-mongodb-native\connection.js:71:5 
    at Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\node_modules\mongodb\lib\db.js:232:5 
    at connectHandler (Z:\techFilez\webApp\MyPiCloud\node_modules\mongoose\node_modules\mongodb\lib\server.js:333:7) 
    at g (events.js:260:16) 
[nodemon] app crashed - waiting for file changes before starting... 

Я сделал несколько вещей: я удостоверяясь используйте fs.unlink (myFile), чтобы удалить из файловой системы, а также закрыть соединение с mongoose после каждого успешного файла. Я использую переменную var myFile = file.path (это путь к файлу из ng-file-upload) - после успешной записи я попытался установить myFile на null, но безрезультатно.

Он работает, когда я переключать представление или обновить страницу, но так как им будет для одной страницы приложения вещи я хотел бы избежать этого .....

вот мой код на стороне сервера:

/** 
* Created by foolishklown on 8/27/2016. 
*/ 
var mongoose = require('mongoose'), 
    path = require('path'), 
    Grid = require('gridfs-stream'), 
    fs = require('fs'), 
    User = require('../../models/user'); 

module.exports = function(file, userId, fileType, res) { 
    var fileId; 
    //console.log('called the write file for gridfs'.green); 
    //console.log('file is: ', file); 
    var conn = mongoose.createConnection('mongodb://localhost/media', (error) => { 
     if(error) { 
      console.error('Error connecting to mongod media instance'.red); 
      process.exit(1); 
     } else { 
      console.info('Connected successfully to mongod media instance in the write file!'.blue); 
     } 
    }); 
    // The following line is designating a file to grab/read, and save into mongo 
    // in our case it will be something from ng-file-upload that the user wants to upload 
    var myFile = file.path; 

    // Connect gridFs and mongo 
    Grid.mongo = mongoose.mongo; 

    conn.once('open', function() { 
     console.log('connection open, ready for I/O!'); 
     var gfs = Grid(conn.db); 

     // This write stream is how well write to mongo 
     var writeStream = gfs.createWriteStream({ 
      // Name the file the way you want it stored in mongo 
      filename: file.originalFilename, 
      type: fileType 
     }); 

     // Create a read stream, so that we can read its data, and then with that well use the 
     // write stream to write to the DB via piping the writestream 
     var readStream = fs.createReadStream(myFile) 
      .on('end',() => { 
       writeToUserDb(userId, fileType, readStream.id); 
       res.status(200).send({id: readStream.id, type: fileType, user: userId}); 
      }) 
      .on('error',() => { 
       res.status(500).send('error in writing with gridfs'); 
      }) 
      .pipe(writeStream); 

     //fs.createReadStream(myFile).pipe(writeStream); 

     writeStream.on('close', function (file) { 
      console.log(file.filename + 'written to DB'); 
      /** 
      setTimeout(1000,() => { 
       fs.unlink(myFile); 
      }); 
      */ 
      fs.unlink(myFile); 
      myFile = null; 
      conn.close(); 
     }); 
    }); 

    function writeToUserDb(uid, type, fileId) { 
     var userConn = mongoose.createConnection('mongodb://localhost/mean-auth', (error) => { 
      if(error) { 
       console.error('Error connecting to the mean-auth instance'.red); 
       process.exit(1); 
      } else { 
       console.info('Connected to the mean-auth instance!'.blue); 
       console.info('Attempting to find user: ' + uid + ', filetype: ' + type + ', streamID: ' + fileId + '!'.green); 
       User.findById(uid, (err, doc) => { 
        if(err) { 
         console.error('Error finding user with id: ', uid); 
         process.exit(1); 
        } else { 
         console.log('original doc: ', doc); 
         doc.addMedia(type, fileId); 
         doc.save(); 
         console.log('new doc: ', doc); 
        } 
       }) 
      } 
     }); 
     userConn.close(); 
    } 
}; 

ответ

1

увы, это не проблема, на заднем конце в концов, это была угловая проблема с загрузкой нг-файл .......

мой HTML:

<div class="row"> 
    <div class="col-lg-10"> 
     <h1>MyPi Audio</h1> 
    </div> 
    <div class="col-lg-2"> 
     <form name="form"> 
      <input type="file" id="file1" name="file" ng-files="getTheFiles($files)" 
        ng-keep="false" 
        accept="'audio/*'"> 
      <input type="button" class="btn btn-default" ng-click="uploadFiles('/dashboard/uploadAudio', 'audio', myCont.currentUser)" value="Upload"> 
     </form> 
    </div> 
</div> 
<div class="row"> 
    <div ng-repeat="audio in myCont.media.audio" style="width:100%;background-color:#999999;border:1px solid deeppink;"> 
     <img ng-src="{{audio.url}}" /> 
     <span>{{audio.name}}</span> 
    </div> 
</div> 

Внутри контроллера, построение данных форм не был сброс ...... старого кода:

var formdata = new FormData(); 

    $scope.getTheFiles = function ($files) {   
      angular.forEach($files, function (value, key) { 
       //console.log('key: ' + key + ', val: ' + $files[key]); 
       formdata.append(key, value); 
      }); 
     } 
    }; 

После того, как был отправлен ответ от сервера, я просто назвали $ scope.getTheFiles (нуль), и добавил проверку нулевых условий в функции, сброс данных формы

var formdata = new FormData(); 

    $scope.getTheFiles = function ($files) { 
     if($files == null) { 
      formdata = new FormData(); 
     } else { 
      angular.forEach($files, function (value, key) { 
       //console.log('key: ' + key + ', val: ' + $files[key]); 
       formdata.append(key, value); 
      }); 
     } 
    }; 

Я ответил на мой вопрос, в случае, если кто-то есть один и тот же вопрос в будущем