如何使用 Busboy 访问 Express 4 req.body 对象

Posted

技术标签:

【中文标题】如何使用 Busboy 访问 Express 4 req.body 对象【英文标题】:How to access Express 4 req.body object using Busboy 【发布时间】:2014-06-30 11:33:55 【问题描述】:

我需要一种简单的方法来使用 busboy-connect 访问 req 对象中的多部分表单数据。我正在使用 Express 4,它现在需要以前内置功能的模块。

我希望 req.body 对象在我的路由中可用,但 busboy.on('field') 函数是异步的,并且在传递它以继续执行代码之前不会处理所有表单数据。

在 busboy 之上构建了一个名为 multer 的中间件模块,它在到达路由之前获取 req.body 对象,但是它覆盖了从内部定义 busboy.on('file') 事件的能力路线。

这是我损坏的代码:

// App.js

app.post(/users, function(req, res, next)

  var busboy = new Busboy( headers: req.headers );

  // handle text field data (code taken from multer.js)
  busboy.on('field', function(fieldname, val, valTruncated, keyTruncated) 
    if (req.body.hasOwnProperty(fieldname)) 
      if (Array.isArray(req.body[fieldname])) 
        req.body[fieldname].push(val);
       else 
        req.body[fieldname] = [req.body[fieldname], val];
      
     else 
      req.body[fieldname] = val;
      console.log(req.body);
    
  );

  busboy.on('file', function(fieldname, file, filename, encoding, mimetype) 

    tmpUploadPath = path.join(__dirname, "uploads/", filename);
    targetPath = path.join(__dirname, "userpics/", filename);

    self.imageName = filename;
    self.imageUrl = filename;

    file.pipe(fs.createWriteStream(tmpUploadPath));
  );

  req.pipe(busboy); // start piping the data.

  console.log(req.body) // outputs nothing, evaluated before busboy.on('field') 
                        // has completed.
 );

更新 我正在使用连接总线男孩。我在我的快速设置文件中使用了这个中间件代码,让我可以访问我的路由中的 req.body 对象。我还可以从我的路线中处理文件上传,并可以访问 req.busbuy.on('end')。

 // busboy middleware to grab req. post data for multipart submissions.
 app.use(busboy( immediate: true ));
 app.use(function(req, res, next) 
   req.busboy.on('field', function(fieldname, val) 
     // console.log(fieldname, val);
     req.body[fieldname] = val;
   );

   req.busboy.on('finish', function()
     next();
   );
 );

【问题讨论】:

我有同样的问题你介意解释一下这段代码是如何工作的吗?我的所有请求都在单独的路由中处理,这个解决方案不适用于我的代码。也许如果我对您的工作有更好的了解,这将帮助我解决我的问题!这是我的第一个节点项目。 @JeffPowers 我无法让中间件像我想象的那样工作。目前没有解决方案来解析“不同”位置的传入 Multipart 数据,例如只解析字段,然后对字段数据做一些事情,然后再解析文件,然后调用 busboy.on(“finish”)。请在此处查看我的帖子:programmers.stackexchange.com/questions/239170/… 如果您有任何发现,请告诉我。我最终在我的控制器中放置了大量的逻辑......这不是一个好的设计选择,但我放弃了。 我得出了同样的结论,我实际上把 busboy 换成了 multer:github.com/expressjs/multer。这要简单得多。 【参考方案1】:

尝试添加:

busboy.on('finish', function() 
  // use req.body
);

【讨论】:

这是我需要的线索。我编辑了 OP 以反映我的解决方案。它是中间件,但我认为它不会减慢收到的帖子。 您可以将您的解决方案缩短为 req.busboy.on('finish', next); 我遇到了另一个问题。我试图在我的节点应用程序中保持适当的关注点分离。到目前为止,我的流程是这样的: 1. app.js:设置 express 中间件以从多部分数据中获取 req.body。我必须使用立即 = true。 2. routes.js:定义 /post 路由,将其传递给控制器​​。 3.controller.js:使用req.body对象格式化数据,新建模型对象,调用model.save(req.body)(开始图片上传过程)。 4. model.js:使用busboy+req.body数据上传图片到服务器。有没有办法先处理req.body,然后传递给文件上传事件? @mscdex 我正在将 reCaptcha 与使用 busboy 的路线一起使用,我需要从 req.body 中获取一个值来进行验证,然后再对上传进行任何操作,可以从这里访问问题 ***.com/questions/34467728/… ,会很高兴你能看看。干杯。

以上是关于如何使用 Busboy 访问 Express 4 req.body 对象的主要内容,如果未能解决你的问题,请参考以下文章

限制快递到特定路线

node.js上传下载pdf文件

Node / Busboy:获取文件大小

NodeJS使用busboy上传文件

如何从响应中访问 Express Checkout 详细信息?

节点 js busboy 不使用 angular js $http post 发出事件