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

时间:2015-07-18 22:15:25

标签: node.js multer

我刚开始学习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

如何实现上传?谢谢。

7 个答案:

答案 0 :(得分:54)

您需要以下列形式之一使用var $curr = $('.toggle').first(); // Hide all the divs $('.toggle').addClass('hide'); // Display the first div $curr.removeClass('hide'); var interval = setInterval(function () { // Hide all the divs $('.toggle').addClass('hide'); var len = $('.toggle').length, found = false; $(".toggle").each(function(index) { // If the curr element is the // element in iteration // select the next indexed element.. if($(this).is($curr) && !found) { var nextIndex = index + 1; if(nextIndex >= len) { $curr = $('.toggle').first(); } else { $curr = $('.toggle').eq(nextIndex); found = true; } } }); $curr.removeClass('hide'); }, 500);

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

在你的HTML中。

答案 1 :(得分:17)

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

});

答案 2 :(得分:8)

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

答案 3 :(得分:6)

自版本1.0.0

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

答案 4 :(得分:4)

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

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

src

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

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

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

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

答案 5 :(得分:3)

更改为app.use(multer({dest:&#39; ./ uploads /&#39;})。single(&#39; photo&#39;));在app.js中,我可以启动服务器

答案 6 :(得分:1)

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

和另一个问题,如何使用&#34; app.use()&#34;? 是指:here