【问题标题】:Error with multipart/form-data in express.js running on Azure在 Azure 上运行的 express.js 中的 multipart/form-data 出错
【发布时间】:2013-05-21 03:40:56
【问题描述】:

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

我在日志中得到的错误是:TypeError: Object # has no method 'tmpDir'

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

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

【问题讨论】:

    标签: node.js azure express


    【解决方案1】:

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

    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];
      });
    

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

    【讨论】:

    【解决方案2】:

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

    server.js:

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

    app.use(express.bodyParser());
    

    packages.json:

    强制节点0.10.21或以上:

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

    Force express 3.4.8或以上:

    "express": "3.4.8"
    

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

    【讨论】:

      猜你喜欢
      • 2017-01-12
      • 1970-01-01
      • 2018-08-04
      • 2021-11-21
      • 1970-01-01
      • 2019-02-26
      • 1970-01-01
      • 1970-01-01
      • 2021-06-03
      相关资源
      最近更新 更多