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

我刚刚开始学习NodeJS,并且遇到了一个问题。 我想上传文件到我的服务器。 为了做到这一点,我search了一下,发现了这个模块的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

我怎样才能实现上传? 谢谢。

你需要使用app.use(multer({dest:'./uploads/'})) ,其forms如下:

 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。

 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('/'); }); 

自1.0.0版以来

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

来自@ 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> 

更改为app.use(multer({dest:'./ uploads /'})。single('photo')); 在app.js为我启动服务器

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

另一个问题,如何使用“app.use()”?
指的是: 这里

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

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

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

现在,使用multer设置任何types的文件的目标目录如下。

 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); }); });