2013-07-16 2 views
0

я следующий код:Meteor/Узел WriteFile сбой сервера

Meteor.methods({ 
    saveFile: function(blob, name, path, encoding) { 
    var path = cleanPath(path), fs = __meteor_bootstrap__.require('fs'), 
     name = cleanName(name || 'file'), encoding = encoding || 'binary', 
     chroot = Meteor.chroot || 'public'; 
    // Clean up the path. Remove any initial and final '/' -we prefix them-, 
    // any sort of attempt to go to the parent directory '..' and any empty directories in 
    // between '/////' - which may happen after removing '..' 
    path = chroot + (path ? '/' + path + '/' : '/'); 

    // TODO Add file existance checks, etc... 
    fs.writeFile(path + name, blob, encoding, function(err) { 
     if (err) { 
     throw (new Meteor.Error(500, 'Failed to save file.', err)); 
     } else { 
     console.log('The file ' + name + ' (' + encoding + ') was saved to ' + path); 
     } 
    }); 

    function cleanPath(str) { 
     if (str) { 
     return str.replace(/\.\./g,'').replace(/\/+/g,''). 
      replace(/^\/+/,'').replace(/\/+$/,''); 
     } 
    } 
    function cleanName(str) { 
     return str.replace(/\.\./g,'').replace(/\//g,''); 
    } 
    } 
}); 

который я взял из этого проекта https://gist.github.com/dariocravero/3922137

код работает отлично, и он сохраняет файл, однако он повторяет вызов несколько раз и каждый раз, когда он вызывает сброс метеора с использованием окон версии 0.5.4. Консоль F12 выглядит следующим образом: enter image description here. Метеорная консоль перебирает код запуска каждый раз, когда выполняется 503, и повторяет журналы консоли в функции saveFile.

Кроме того, в целевом каталоге миниатюра изображения продолжает отображаться, а затем отображается как сломанная, а затем действительная миниатюра, как если бы fs записывал ее несколько раз.

Вот код, который вызывает функцию:

"click .savePhoto":function(e, template){ 
    e.preventDefault(); 
    var MAX_WIDTH = 400; 
    var MAX_HEIGHT = 300; 
    var id = e.srcElement.id; 
    var item = Session.get("employeeItem"); 
    var file = template.find('input[name='+id+']').files[0]; 
    // $(template).append("Loading..."); 
    var dataURL = '/.bgimages/'+file.name; 
    Meteor.saveFile(file, file.name, "/.bgimages/", function(){ 
     if(id=="goodPhoto"){ 
      EmployeeCollection.update(item._id, { $set: { good_photo: dataURL }}); 
     }else{ 
      EmployeeCollection.update(item._id, { $set: { bad_photo: dataURL }}); 
     } 
     // Update an image on the page with the data 
     $(template.find('img.'+id)).delay(1000).attr('src', dataURL); 
    });  



}, 

Что вызывает сервер для сброса?

+0

Вы уверены, что используете эту функцию только один раз? Как выглядит ваш звонок? –

+0

@HubertOG Я обновил вопрос, включив код звонка – rickyduck

ответ

3

Мое предположение заключается в том, что, поскольку Meteor имеет встроенное «автоматическое сканирование каталогов в поисках изменений файла», чтобы реализовать автоматическую перезагрузку приложения на новейшей базе кода, создаваемый вами файл фактически вызывает перезагрузка сервера.

Meteor не сканирует каталоги, начинающиеся с так называемых «скрытых» каталогов, например, например .git, поэтому вы можете использовать это поведение в своих интересах, установив путь к вашим файлам в .directory твой собственный.

Вы также должны рассмотреть возможность использования writeFileSync, поскольку методы Meteor предназначены для синхронного запуска (внутри волокон узла) в отличие от обычного асинхронного вызова узлового узла, в этом коде это не имеет большого значения, но, например, вы не можете использовать Метеорная механика внутри обратного вызова writeFile.

asynchronousCall(function(error,result){ 
    if(error){ 
     // handle error 
    } 
    else{ 
     // do something with result 
     Collection.update(id,result);// error ! Meteor code must run inside fiber 
    } 
}); 

var result=synchronousCall(); 
Collection.update(id,result);// good to go ! 

Конечно, есть способ превратить любой асинхронный вызов внутри синхронного с использованием волокон/будущего, но это за точку этого вопроса: Я рекомендую прочитать эту EventedMind episode on node future, чтобы понять эту конкретную область.

+0

@saimeunit благодарит за ответ. Папка bgimages находится публично, поэтому не следует ли игнорировать изменения в любом случае? Во всяком случае, я изменил имя папки на «.bgimages», но безрезультатно, то же самое происходит – rickyduck

+0

Я также пробовал: http://stackoverflow.com/questions/13201723/generating-and-serving-static-files-with- метеор, но изменил «NPM.require» на 0.5.4 '__meteor_bootstrap __. require', но я получаю код с кодом: 1 – rickyduck

+0

@saimeunit прав, и, к сожалению,« публичная »папка не игнорируется Meteor из-за некоторых кеширование или что там сделано. Однако использование названия папки, начинающейся с точки, помогло бы, если бы это была единственная проблема. Если это не удается, попробуйте сохранить файлы в каталоге вне приложения Meteor - вы, вероятно, получите разрешения, но это может стоить того. –