0

我有以下代码:

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

该代码工作正常,它保存了文件,但是它重复调用几次,每次它导致meteor使用windows 0.5.4版重置。F12 控制台最终看起来像这样:在此处输入图像描述. 每次 503 发生时,meteor 控制台都会循环启动代码,并在 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);
    });     



},

是什么导致服务器重置?

4

1 回答 1

3

我的猜测是,由于 Meteor 具有内置的“自动目录扫描以搜索文件更改”,为了实现应用程序自动重新启动到最新的代码库,您正在创建的文件实际上导致服务器重置。

Meteor 不会扫描以点开头的目录(所谓的“隐藏”目录),例如 .git,因此您可以通过将文件的路径设置为您自己的 .directory 来利用这种行为。

您还应该考虑使用 writeFileSync,因为 Meteor 方法旨在同步运行(在节点纤程内),这与异步调用的通常节点方式相反,在此代码中这没什么大不了的,但例如,您不能在内部使用任何 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 !

当然,有一种方法可以使用 Fiber/Future 将任何异步调用转换为同步调用,但这超出了这个问题的重点:我建议阅读Node Future 上的 EventedMind 插曲以了解这个特定领域。

于 2013-07-16T11:44:15.743 回答