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

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

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

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

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

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

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

在阅读了大量的post,线程等之后,我发现你应该能够解决这个问题,你需要设置bodyParser的uploadDir属性。

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

然而,在编写连接的多部分表单处理的时候(在撰写本文时),它创build了一个IncomingForm对象,而不将任何parameter passing给构造函数,然后再设置属性:

 var form = new formidable.IncomingForm , data = {} , files = {} , done; Object.keys(options).forEach(function(key){ form[key] = options[key]; }); 

所以我已经分叉expression和连接和更新代码读取为:

 var form = new formidable.IncomingForm(options) , data = {} , files = {} , done; Object.keys(options).forEach(function(key){ form[key] = options[key]; }); 

你可以在这里find分支版本: 不是无耻的插件

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

server.js:

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

 app.use(express.bodyParser()); 

packages.json:

强制节点0.10.21或以上:

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

部队expression3.4.8或以上:

 "express": "3.4.8" 

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