【问题标题】:Cannot app.use(multer). "requires middleware function" error不能 app.use(multer)。 “需要中间件功能”错误
【发布时间】: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

如何实现该上传?谢谢。

【问题讨论】:

  • 哦,我的...我发誓我已经在这里搜索过...谢谢stdob...但是,奇怪的是(对我来说)它仍然会以这种方式自动上传文件...我虽然我会可以用fs控制和写...我会想办法的,谢谢

标签: node.js multer


【解决方案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('/');
    
    });
    

    【讨论】:

    • 如果这个答案包含一些关于它如何回答问题和解决问题的解释,将会得到改进。
    • StackOverflow 要求您仅以英文发布问题、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')); 可以正常工作,但与回调不同。你能检查一下这个问题吗? stackoverflow.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

      【讨论】:

        猜你喜欢
        • 2015-01-20
        • 1970-01-01
        • 2019-11-14
        • 1970-01-01
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多