在Azure上运行的express.js中的multipart / form-data出错

时间:2013-05-25 20:24:40

标签: node.js azure express

所以我在Windows Azure上运行了一个快速站点。我目前在提交标记为enctype =“multipart / form-data”的表单时遇到问题。

我在日志中遇到的错误是:TypeError:Object#没有方法'tmpDir'

当本地运行时(通过node.exe启动)它运行得非常好,只有在使用AzureEmulator或Azure本身时才会失败。

现在我希望这与Azure的基础设施有关,但我想知道是否有人设法解决这个问题?

2 个答案:

答案 0 :(得分:2)

这是一个多方面的问题,我会尽可能地解释我的发现,请耐心等待。

Connect使用node-formidable进行多部分表单解析,特别是IncomingForm类。在IncomingForm的构造函数中,它将上传目录设置为您传入的参数的目录,或者默认为操作系统的临时目录,由os.tmpDir()定义。但是,节点的“os”模块的Windows实现中缺少此方法。

在阅读了大量帖子,帖子等之后,我发现你应该可以解决这个问题,你需要设置bodyParser的 uploadDir 属性。

app.use(express.bodyParser({ uploadDir: 'path/to/dir' }));

然而,在撰写本文时,连接的多部分表单处理实现中存在一个错误:它创建一个IncomingForm对象,而不将任何参数传递给构造函数,然后进一步设置属性:

var form = new formidable.IncomingForm
    , data = {}
    , files = {}
    , done;

  Object.keys(options).forEach(function(key){
    form[key] = options[key];
  });

所以我把快递和快递分开了。连接并更新代码以读取:

var form = new formidable.IncomingForm(options)
    , data = {}
    , files = {}
    , done;

  Object.keys(options).forEach(function(key){
    form[key] = options[key];
  });

您可以在此处找到分叉版本:not a shameless plug

答案 1 :(得分:1)

修复Windows环境(Azure网站+ node.js应用程序)。

server.js:

确保它没有设置上传目录或tmp目录

app.use(express.bodyParser());

packages.json:

强制节点0.10.21或以上:

"engines": { "node": "v0.10.24" }

强制表达3.4.8或以上:

"express": "3.4.8"

这应该将您的节点更新为固定的lib版本,问题应该消失。