web-dev-qa-db-ja.com

app.useを使用したマルチ設定はTypeErrorを返します

ユーザーが画像をアップロードできるようにするために、(node.js/expressを使用して)app.jsファイルでmulterを構成しようとしています。 app.jsに次のコードがあります。

_//various require statements for passport, cookie parser, etc..

var multer = require('multer');

var app = express();

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

アプリを実行しようとすると、TypeError: app.use() requires middleware functionsが表示されます

この質問には、アプリに関してもう少しコンテキストが必要になる場合があることを理解しています。追加情報が必要な場合はお知らせください。

ありがとうございました

編集:app.jsからのより多くのコード:

_var express = require('express');
var path = require('path');
var favicon = require('serve-favicon');
var logger = require('morgan');
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
var session = require('express-session');
//var fs = require('fs');
var multer = require('multer');

//Mongo Database
var mongo = require('mongodb');
var monk = require('monk');
var db = monk('localhost:27017/test-api');

//Instagram-API
var api = require('instagram-node').instagram();

//Cookie Manager
var cookieParser = require('cookie-parser');

//Grid
//var Grid = require('gridfs-stream');

//Passport
var passport = require('passport');
var InstagramStrategy = require('passport-instagram').Strategy;

var routes = require('./routes/index');
//var users = require('./routes/users');

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// uncomment after placing your favicon in /public
//app.use(favicon(__dirname + '/public/favicon.ico'));
app.use(logger('dev'));
app.use(multer({dest:'./uploads/'}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cookieParser());
app.use(methodOverride());
app.use(session({secret: 'keyboard cat', resave: false, saveUninitialized: true }));
app.use(passport.initialize());
app.use(passport.session());
app.use(express.static(path.join(__dirname, 'public')));


// Make our db accessible to our router
app.use(function(req,res,next){
    req.db = db;
    next();
});

app.use('/', routes);
_
12
prcbass

問題は、ミドルウェア関数ではなく、multer({dest:'./uploads/'})がオブジェクトを返すことです。そして、コードモジュールを見ると、3つのmiddlware関数があることがわかります。

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

それらの1つを試してください。

19
stdob--

クレジットは@stdobに送られます-私を正しい方向に導いてくれたからです。私が見ていたmulterのドキュメントは、作業中に更新されたようで、コードを誤って使用していました。

Multerは、ミドルウェア機能とともに使用する必要があります。したがって、このパッケージを使用する正しい方法は次のとおりです。

var multer = require('multer');

var upload = multer({dest:'uploads/'});

var cpUpload = upload.single('postImg');

router.post('/createpost', cpUpload, function(req,res){

  console.log(req.file);
  res.redirect('/');

}

このコードスニペットは、「/ createpost」の投稿ルートを作成し、単一のドキュメント(フォーム名「postImg」)をサーバーの/ uploadsにアップロードします。 req.fileには、ファイル情報(ファイルパスなど)を含むJSONが含まれます。これにより、アップロードされたファイルが自動的に削除されるわけではないことに注意してください。

詳細については、こちらをご覧ください: https://www.npmjs.com/package/multer

10
prcbass

これでうまくいく

app.use(multer({dest:'./public/images/uploads'}).any());
3
Hamid Ali