2016-06-24 5 views
-1

У меня есть приложение, сгенерированное с помощью экспресс-генератора, с файлом bin/www и файлом app.js. В app.js я добавил следующее:Узел/Экспресс 4 промежуточное ПО не работает

app.use(function(req, res, next){ 
     console.log("--------new middleware"); 
     next(); 
    }); 

Но он не вызывает промежуточное ПО вообще. Остальное приложение работает нормально, и я подтвердил, что сервер работает и получает запросы.

Вот это app.js:

var express = require('express'); 
var path = require('path'); 
var favicon = require('serve-favicon'); 
var logger = require('morgan'); 
var cookieParser = require('cookie-parser'); 
var bodyParser = require('body-parser'); 
var session = require('express-session'); 
var passport = require('passport'); 


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

app.use(logger('dev')); 
app.use(bodyParser.json()); 
app.use(bodyParser.urlencoded({ extended: false })); 
app.use(cookieParser()); 
app.use(express.static(path.join(__dirname, 'public'))); 
app.use(session({ secret: 'separation anxiety' })); 
app.use(passport.initialize()); 
app.use(passport.session()); 

app.use('/', routes); 
app.use('/users', users); 

// участки путей

app.use(function(req, res, next){ 
    console.log("--------new middleware"); 
    next(); 
}); 

// app.use(auth.isLoggedIn); 

// catch 404 and forward to error handler 
app.use(function(req, res, next) { 
    var err = new Error('Not Found'); 
    err.status = 404; 
    next(err); 
}); 

// development error handler 
// will print stacktrace 
if (app.get('env') === 'development') { 
    app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
     message: err.message, 
     error: err 
    }); 
    }); 
} 

// production error handler 
// no stacktraces leaked to user 
app.use(function(err, req, res, next) { 
    res.status(err.status || 500); 
    res.render('error', { 
    message: err.message, 
    error: {} 
    }); 
}); 

module.exports = app; 
+0

У вас неправильная подпись функции для промежуточного программного обеспечения. Аргумента 'err' нет. См. Http://expressjs.com/en/4x/api.html#app.use – jfriend00

+0

в соответствии с моим сообщением выше. Я пробовал это без помощи (..Я также пробовал это без ошибки в передней части). Я должен сделать это более ясным. – Mankind1023

+0

Ваш сервер даже работает? Вы получаете какие-либо запросы? Если 'app.get ('/', ...)' даже не работает, значит, ваш сервер, вероятно, не работает или не инициализирован должным образом. Второй кодовый блок правильный и будет работать, если все будет сделано правильно. Итак, если этот второй блок кода не работает, то в коде есть что-то еще не так, что вы не разгласили. Нам нужно будет увидеть остальную часть вашего кода, чтобы узнать, что еще не так. – jfriend00

ответ

3

Важная вещь, чтобы знать о Экспресс промежуточного слоя заключается в том, что он называется в порядке декларации.

Если какое-либо из заявленного промежуточного программного обеспечения обрабатывает запрос (путем отправки ответа), запрос не передается ни одному промежуточному программному обеспечению, объявленному после обработки запроса.

Итак, если вы добавили промежуточное ПО «все-ко всем» после того, как было объявлено все другое промежуточное ПО, возможно, что никакой запрос никогда не будет передан вашему промежуточному программному обеспечению, потому что он был обработан где-то в другом месте.

Чтобы исправить это, объявите свое промежуточное ПО где-то «высоко вверх» в цепочке промежуточного программного обеспечения. В вашем случае, попробуйте объявить его перед express.static:

app.use(function(req, res, next){ 
    console.log("--------new middleware"); 
    next(); 
}); 
app.use(express.static(path.join(__dirname, 'public'))); 

Это будет зависеть от конечной цели вашего промежуточного слоя, что правильное место в цепи промежуточного слоя будет.

Или, поскольку вы добавили промежуточное программное обеспечение прямо над обработчиком 404, попробуйте запросить несуществующий URL-адрес с вашего сервера; это также должно вызвать ваше промежуточное ПО.

+0

Так что запрос на несуществующий URL-адрес вызвал его, любой способ сделать этот запуск на каждом вызове или, по крайней мере, на каждом маршруте? – Mankind1023

+0

@ Mankind1023 yes, переместите его наверх, где объявляются ваши маршруты. – robertklep

+0

Хорошо, так что положить это на верхнюю часть файла, похоже, делает трюк, спасибо! – Mankind1023

 Смежные вопросы

  • Нет связанных вопросов^_^