Cannot app.use(multer). “requires middleware function” error

[亡魂溺海] 提交于 2019-12-28 02:02:05

问题


I'm just starting learning NodeJS and I am stuck with a problem. I would like to upload files to my server. To do so I searched and found out this module multer. Doing as the example on GitHub works:

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

On posting an image with FormData to /uploadImage the image is saved in the uploads/ directory. The thing is the image is saved with a strange name and I would like to save it with its original name. To do so I understood that I would have to call app.use(multer({ dest: 'uploads/' }))' and then I would be able to access req.file in my function like:

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

But I get an error on trying app.use():

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

Im using NodeJS 0.12.7 and Express 4.13.1

How can I achieve that upload? Thanks.


回答1:


You need to use app.use(multer({dest:'./uploads/'})) in the form of one of these:

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

ie:

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

And be sure to have something like:

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

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

});



回答3:


The answer from @127.0.0.1 is correct, but in case you are using Express Router, the code changes a little bit:

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

  //...
});

And the important bit, the form encoding should be enctype="multipart/form-data" as already said, like that:

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



回答4:


Since version 1.0.0

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



回答5:


You can't change the file name using multer but you can use Node.js stream and fs module to copy the content of already uploaded file to new file(set as original file name) on same folder and delete old one.

First of all import fs, path and multer in your node script.

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

Now, set destination directory of any type of files using multer as below.

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

Now use stream and fs to resolve your issue.

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



回答6:


Changing to app.use(multer({dest:'./uploads/'}).single('photo')); in the app.js works for me to start the server




回答7:


I encountered the same problem. And I solved it. For the first problem, how to get the original file name? I printed the whole request and found we could get original name by using the path "req.file.originalname"

and the other question, how to use "app.use()"?
refers: here



来源:https://stackoverflow.com/questions/31496100/cannot-app-usemulter-requires-middleware-function-error

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!