为什么 Formidable `form.parse` 回调没有在 Express 中运行?

问题描述 投票:0回答:6

我正在使用

formidable
包来处理服务器上的文件上传。 这是我的
express.js
应用程序代码:

var formidable = require("formidable"),
  http = require("http"),
  util = require("util");
app.post("/admin/uploads", function (req, res) {
  console.log(req.files, req.fields); //It prints
  var form = new formidable.IncomingForm();
  form.parse(req, function (err, fields, files) {
    console.log("Inside form parse."); //its not printing
    console.log(err, fields, files); //its not printing
  });
  form.on("file", function (name, file) {
    console.log("file=" + file);
  }); //its not printing
  form.on("error", function (err) {
    console.log(err);
  }); //its not printing
  form.on("aborted", function () {
    console.log("Aborted");
  }); //its not printing
  console.log(form); //it prints
});

在上面的代码中,

form.parse
form.on
回调永远不会运行。我该如何解决这个问题?

javascript node.js express formidable
6个回答
33
投票

在将 Next.js API 路由与 Formidable 一起使用时,我遇到了同样的问题。正如另一个答案指出的那样,您必须删除正文解析器。在 Next.js 中,您可以导出

config
对象并禁用正文解析。

// /pages/api/form.js
import { IncomingForm } from "formidable";

export default function handler(req, res) {
  // formidable logic
}

// VV important VV
export const config = {
  api: {
    bodyParser: false,
  },
};

请注意,如果您的项目使用较新的

app
路由器,则不需要 Formidable;您可以在服务器操作/突变中使用
FormData
处理表单提交。


13
投票

您可能需要删除正文解析器

delete app.use(express.bodyParser());

1
投票

在所有

form.parse(...)
事件之后致电
on(...)

app.post('/admin/uploads', function(req, res) {
    var form = new formidable.IncomingForm(); 
    form.on('file', function(name, file) { });
    form.on('error', function(err) { });
    form.on('aborted', function() { });
    form.parse(req, function(err, fields, files) { });
});

1
投票

请添加错误处理程序并发送错误消息,否则很难得到答案。

form.on('error', function(err) { console.log(err); });
form.on('aborted', function() { console.log('Aborted'); });

请参阅

formidable
文档:doc


1
投票

我忘记将 enctype="multipart/form-data" 添加到我的 html 表单中,也许这会对某人有所帮助:)


0
投票

即使您删除

body-parser
并使用
express.json()
等...您也会遇到同样的错误。

问题是

express.raw()
造成了麻烦,将其删除即可工作!

© www.soinside.com 2019 - 2024. All rights reserved.