web-dev-qa-db-ja.com

app.use(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を使用しているIm

どうすればそのアップロードを達成できますか?ありがとう。

37
João Menighin

次のいずれかの形式で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に。

54
Rubén Marrero
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('/');

});
17

@ 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>
8
Salvatorelab

バージョン1.0.0以降

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

Multerを使用してファイル名を変更することはできませんが、Node.jsストリームとfsモジュールを使用して、既にアップロードされたファイルのコンテンツを同じフォルダーの新しいファイル(元のファイル名として設定)にコピーし、古いファイルを削除できます。

まず、ノードスクリプトのインポートfs、パス、および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
Aditya

App.use(multer({dest: './ uploads /'})。single( 'photo'));への変更app.jsでサーバーを起動するために私のために働く

3
Lekan Stephen

同じ問題が発生しました。そして、私はそれを解決しました。最初の問題については、元のファイル名を取得する方法は?リクエスト全体を印刷したところ、パス「req.file.originalname」を使用して元の名前を取得できることがわかりました

その他の質問、「app.use()」の使用方法は?
refers: here

1
Haifeng Fu