不能 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)。 “需要中间件功能”错误的主要内容,如果未能解决你的问题,请参考以下文章
throw new TypeError('app.use() 需要中间件函数') - 表示应用程序错误