Промежуточное программное обеспечение Node / Express 4 не работает

У меня есть приложение, сгенерированное с помощью express-generator, с файлом bin / www и файлом app.js. В app.js я добавил следующее:

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

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

Вот приложение.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;

1 ответ

Решение

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

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

Поэтому, если вы добавите промежуточное программное обеспечение "всеохватывающего" после того, как все другое промежуточное программное обеспечение будет объявлено, есть вероятность, что ни один запрос никогда не будет передан вашему промежуточному программному обеспечению, потому что он был обработан где-то еще.

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

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

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

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

Другие вопросы по тегам