我正在使用multer npm模块上传一个文件到我的应用程序。

我所定义的multer函数是允许将单个文件上传到文件系统。在运行时一切正常;问题是我上传文件后,我得到一个错误下面。任何关于去哪里找的建议都非常感谢。

错误:

Unexpected field

Error: Unexpected field
    at makeError (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\lib\make-error.js:12:13)
    at wrappedFileFilter (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\index.js:39:19)
    at Busboy.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\lib\make-middleware.js:97:7)
    at Busboy.emit (events.js:118:17)
    at Busboy.emit (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\lib\main.js:31:35)
    at PartStream.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\lib\types\multipart.js:205:13)
    at PartStream.emit (events.js:107:17)
    at HeaderParser.<anonymous> (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\Dicer.js:51:16)
    at HeaderParser.emit (events.js:107:17)
    at HeaderParser._finish (c:\Users\Dev\WebstormProjects\Crunch\node_modules\multer\node_modules\busboy\node_modules\dicer\lib\HeaderParser.js:70:8) 

app.js

var multer = require('multer');
var app = express();
var fs = require('fs');

//. . . 

var upload = multer({ dest: 'upload/'});
var type = upload.single('file');

app.post('/upload', type, function (req,res) {
  var tmp_path = req.files.recfile.path;
  var target_path = 'uploads/' + req.files.recfile.name;
fs.readFile(tmp_path, function(err, data)
{
  fs.writeFile(target_path, data, function (err)
  {
    res.render('complete');
  })
});

Index.hbs

<form action="/upload" method="post" enctype="multipart/form-data">
    <input type="file" name='recfile' placeholder="Select file"/>
    <br/>
    <button>Upload</button>
</form>

#Package.json
  "dependencies": {
    "body-parser": "~1.13.2",
    "cookie-parser": "~1.3.5",
    "debug": "~2.2.0",
    "easy-zip": "0.0.4",
    "express": "~4.13.1",
    "hbs": "~3.1.0",
    "less-middleware": "1.0.x",
    "morgan": "~1.6.1",
    "multer": "~1.0.0",
    "serve-favicon": "~2.3.0"
  }
}

当前回答

接着文森特的回答。

这不是对问题的直接回答,因为这个问题使用了一个表单。

对我来说,使用的不是输入标记的名称,而是将文件追加到formData时的名称。

前端文件

   var formData = new FormData();
   formData.append('<NAME>',this.new_attachments)

Web服务文件:

   app.post('/upload', upload.single('<NAME>'),...

其他回答

接着文森特的回答。

这不是对问题的直接回答,因为这个问题使用了一个表单。

对我来说,使用的不是输入标记的名称,而是将文件追加到formData时的名称。

前端文件

   var formData = new FormData();
   formData.append('<NAME>',this.new_attachments)

Web服务文件:

   app.post('/upload', upload.single('<NAME>'),...

我解决了这个问题,寻找我在请求中传递的名称

我在身体上写道:

{thumbbail: <myimg>}

我被期待着:

upload.single('thumbnail')

因此,我修复了请求发送的名称

在我的场景中,发生这种情况是因为我重命名了swagger中的一个参数。Yaml,但没有重新加载文档页面。 因此,我尝试使用一个意想不到的输入参数的API。 长话短说,F5是我的朋友。

我们必须确保带有name属性的type= file应该是相同的 作为upload.single('attr')中传递的参数名

var multer  = require('multer');
var upload = multer({ dest: 'upload/'});
var fs = require('fs');

/** Permissible loading a single file, 
    the value of the attribute "name" in the form of "recfile". **/
var type = upload.single('recfile');

app.post('/upload', type, function (req,res) {

  /** When using the "single"
      data come in "req.file" regardless of the attribute "name". **/
  var tmp_path = req.file.path;

  /** The original name of the uploaded file
      stored in the variable "originalname". **/
  var target_path = 'uploads/' + req.file.originalname;

  /** A better way to copy the uploaded file. **/
  var src = fs.createReadStream(tmp_path);
  var dest = fs.createWriteStream(target_path);
  src.pipe(dest);
  src.on('end', function() { res.render('complete'); });
  src.on('error', function(err) { res.render('error'); });

});

可能你给的名字和你在邮件中提到的不一样 upload.single(“文件”)。