不能 app.use(multer)。 “需要中间件功能”错误

Posted

技术标签:

【中文标题】不能 app.use(multer)。 “需要中间件功能”错误【英文标题】:Cannot app.use(multer). "requires middleware function" error 【发布时间】:2015-10-08 08:55:18 【问题描述】:

我刚刚开始学习 NodeJS,但遇到了一个问题。我想将文件上传到我的服务器。为此,我搜索并找到了这个模块multer。按照 GitHub 上的示例进行操作:

var express = require('express');
var multer = require('multer');
var upload = multer( dest: 'uploads/' );

var app = express()

app.post('/uploadImage', upload.single('image'), function(req, res) 
    console.log(req.file);
);

在将带有 FormData 的图像发布到/uploadImage 时,图像将保存在uploads/ 目录中。问题是图像以一个奇怪的名称保存,我想用它的原始名称保存它。 为此,我知道我必须调用app.use(multer( dest: 'uploads/' ))',然后我才能在我的函数中访问req.file,例如:

app.post('/uploadImage', function(req, res) 
    console.log(req.file);
);

但我在尝试 app.use() 时遇到错误:

TypeError: app.use() requires middleware functions
    at EventEmitter.use (project\node_modules\express\lib\application
.js:209:11)

我正在使用 NodeJS 0.12.7 和 Express 4.13.1

如何实现该上传?谢谢。

【问题讨论】:

***.com/a/31495796/4989460 哦,我的...我发誓我已经在这里搜索过...谢谢stdob...但是,奇怪的是(对我来说)它仍然会以这种方式自动上传文件...我虽然我会可以用fs控制和写...我会想办法的,谢谢 【参考方案1】:

您需要以下列形式之一使用app.use(multer(dest:'./uploads/'))

app.use(multer(dest:'./uploads/').single(...));
app.use(multer(dest:'./uploads/').array(...));
app.use(multer(dest:'./uploads/').fields(...));

即:

app.use(multer(dest:'./uploads/').single('photo'));

并且一定要有类似的东西:

<form action="/postPhotos" enctype="multipart/form-data" method="post">
    <input type="file" name="photo">
    <input type="submit" value="Upload photo">
</form>

在您的 html 中。

【讨论】:

【参考方案2】:
var app = require('express');

var multer = require('multer');

app=express();

app.use(multer(dest:__dirname+'/file/uploads/').any());

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

    console.log(req.files);

    res.redirect('/');

);

【讨论】:

如果这个答案包含一些关于它如何回答问题和解决问题的解释,将会得到改进。 *** 要求您仅以英文发布问题、cmets 和答案。 (英语,赞成。)另外,使用edit 链接直接更新您的答案。【参考方案3】:

@127.0.0.1 的回答是正确的,但是如果你使用的是Express Router,代码会有一点变化:

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

var router = express.Router();

var uploads = multer(
  dest: 'public/uploads/'
);

router.post('/upload', uploads.single('avatar'), function(req, res, next) 
  console.log(req.file);

  //...
);

重要的是,表单编码应该是enctype="multipart/form-data",就像前面所说的那样:

<form action="/upload" enctype="multipart/form-data" method="post">
    <input type="file" name="avatar">
    <input type="submit" value="Go avatar go!">
</form>

【讨论】:

嗨,我正在使用multer, expres, ng2-file-upload 堆栈,而您的确切代码对我不起作用。 req.file 未定义,我的文件信息在 req.files 上(在我的 html 上我没有多重选择器)。当我在我的按钮上单击上传时,服务器返回上传的文件 bt 文件不存在于服务器上。会做错什么? 我建议先在没有角度的情况下对其进行测试。我的意思是直接使用 Postman 或 CURL 或您最喜欢的工具将请求发送到后端。如果可行,则问题出在前端。如果没有,问题出在后端。它不会解决问题,但会帮助您更快地解决问题。 如果我添加这个app.use(multer(storage:storage).single('file')); 可以正常工作,但与回调不同。你能检查一下这个问题吗? ***.com/questions/44165037/… Salvatorelab,我一直在寻找 2 小时以上的时间,试图弄清楚为什么我无法调试 upload.single 在使用快速路由器时不是一个功能。只是想指出这一点,因为这不是 OP 试图解决的问题,可能会帮助其他人。【参考方案4】:

您不能使用 multer 更改文件名,但您可以使用 Node.js 流和 fs 模块将已上传文件的内容复制到同一文件夹中的新文件(设置为原始文件名)并删除旧文件。

首先在你的节点脚本中导入 fs、path 和 multer。

var express = require('express');
var multer = require('multer');
var fs = require('fs');
var pathModule = require('path');

现在,使用 multer 设置任何类型文件的目标目录,如下所示。

var app = express();
app.use(multer(dest:__dirname+'/resoucres/').any());

现在使用 stream 和 fs 来解决您的问题。

app.post('/uploadImage', function(request, response) 
    var readerStream = fs.createReadStream(request.files[0].path);
    var dest_file = pathModule.join(request.files[0].destination, request.files[0].originalname);
    var writerStream = fs.createWriteStream(dest_file);

    var stream = readerStream.pipe(writerStream);
    stream.on('finish', function()
        fs.unlink(request.files[0].path);
    );
);

【讨论】:

【参考方案5】:

从 1.0.0 版开始

var upload = multer( dest: 'tmp/' );
app.post('/file_upload', upload.single('photo'), function (req, res) 

【讨论】:

这里的upload.single('photo') 是什么??【参考方案6】:

更改为 app.use(multer(dest:'./uploads/').single('photo'));在 app.js 中为我工作以启动服务器

【讨论】:

你能再解释一下吗?【参考方案7】:

我遇到了同样的问题。我解决了它。 对于第一个问题,如何获取原始文件名? 我打印了整个请求,发现我们可以通过使用路径获得原始名称 "req.file.originalname"

还有一个问题,如何使用“app.use()”? 指:here

【讨论】:

以上是关于不能 app.use(multer)。 “需要中间件功能”错误的主要内容,如果未能解决你的问题,请参考以下文章

typeerror: app.use() 需要中间件函数

throw new TypeError('app.use() 需要中间件函数') - 表示应用程序错误

NodeJS Multer 不工作

Node.js 上传文件

Nodejs进阶:基于express+multer的文件上传

nodejs Multer中间件