1

So I've got an express site running on Windows Azure. I'm currently having problems submitting forms that are marked as enctype="multipart/form-data".

The error I'm getting in the logs is: TypeError: Object # has no method 'tmpDir'

When running natively (initiated via node.exe) it works absolutely fine, its only when using the AzureEmulator or on Azure itself it fails.

Now I expect this has something to do with Azure's infrastructure, but I'm wondering whether anyone has managed to work around this?

4

2 回答 2

2

所以这里是一个多管齐下的问题,我会尽可能地解释我的发现,请多多包涵。

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

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

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

但是(在撰写本文时)connect 的多部分表单处理实现中存在一个错误,因为它创建了一个 IncomingForm 对象而不将任何参数传递给构造函数,然后将属性设置得更远:

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

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

所以我已经分叉了 express & connect 并更新了代码以读取为:

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

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

你可以在这里找到分叉的版本:不是无耻的插件

于 2013-05-29T16:57:07.300 回答
1

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

server.js:

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

app.use(express.bodyParser());

包.json:

强制节点 0.10.21 或更高版本:

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

强制快递3.4.8或以上:

"express": "3.4.8"

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

于 2014-02-20T18:03:30.843 回答