Конфигурация multer с app.use возвращает TypeError

Я пытаюсь настроить multer в своем файле app.js (используя node.js/express), чтобы пользователи могли загружать изображения. У меня есть следующий код в 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);

person prcbass    schedule 18.07.2015    source источник
comment
снято в темноте, но имеет ли переменная multer правильное значение после того, как она вам потребуется? (есть ли какие-либо строки, касающиеся мультера, которые вы пропустили в своем образце?) Какие версии мультера и экспресса вы используете?   -  person doldt    schedule 19.07.2015
comment
Насколько я могу судить, кроме тех, которые я опубликовал, нет строк, ссылающихся на multer. Я использую экспресс 4.12.4 и мультипликатор 1.0.0 (кажется, лол, я получил эти версии из package.json). Позвольте мне отредактировать мой вопрос с большим количеством кода   -  person prcbass    schedule 19.07.2015


Ответы (3)


Проблема в том, что multer({dest:'./uploads/'}) возвращает объект, а не промежуточную функцию. И если мы посмотрим на модуль кода, то увидим, что есть три функции промежуточного программного обеспечения:

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

Попробуйте один из них.

person stdob--    schedule 18.07.2015
comment
Хорошо, я немного смущен тем, почему страница npm имеет что-то похожее на мой код в их примере. npmjs.com/package/multer Должен ли я использовать одну из перечисленных выше функций? - person prcbass; 19.07.2015
comment
Подождите, кажется, что страница, на которую я ссылался, была обновлена ​​совсем недавно, и я не обновлял страницу. Не могли бы вы привести пример правильного использования multer({dest:'./uploads/'}) - person prcbass; 19.07.2015
comment
Странно, может документация устарела? Или я ошибаюсь. Так или иначе. Например: app.use(multer({dest:'./uploads/'}).single('photo')); - разрешить загрузку одного файла с формой fieldName photo. - person stdob--; 19.07.2015
comment
Я верю, что понял это. Я опубликую свою работу в качестве ответа. Спасибо за ответ! Я почти уверен, что документация была обновлена, пока я работал над этим, и по этой причине я использовал неправильный синтаксис, лол. - person prcbass; 19.07.2015

Спасибо @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

person prcbass    schedule 18.07.2015

это будет делать

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