Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点/Express 4中间件不工作_Node.js_Express_Middleware_Express Generator - Fatal编程技术网

Node.js 节点/Express 4中间件不工作

Node.js 节点/Express 4中间件不工作,node.js,express,middleware,express-generator,Node.js,Express,Middleware,Express Generator,我有一个用express generator生成的应用程序,有一个bin/www文件和一个app.js文件。在app.js中,我添加了以下内容: app.use(function(req, res, next){ console.log("--------new middleware"); next(); }); 但它根本没有调用中间件。应用程序的其余部分工作正常,我已经确认服务器正在运行并接收请求 以下是app.js: var express = requir

我有一个用express generator生成的应用程序,有一个bin/www文件和一个app.js文件。在app.js中,我添加了以下内容:

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;

关于Express中间件,需要了解的一件重要事情是,它是按照声明的顺序调用的

如果任何声明的中间件通过发送回响应来处理请求,则该请求不会传递给在处理该请求的中间件之后声明的任何中间件

因此,如果在声明了所有其他中间件之后添加一个catch-all中间件,那么很可能不会将任何请求传递给您的中间件,因为它是在其他地方处理的

要解决这个问题,请在中间件链的某个较高位置声明中间件。在您的情况下,请尝试在express.static之前声明它:

它将取决于中间件的最终目标,即中间件链中的正确位置


或者,由于您在404处理程序的正上方添加了中间件,请尝试从您的服务器请求一个不存在的URL;这也会触发中间件。

中间件的函数签名错误。没有错误的论点。正如我上面的帖子所说,我也试过了,但没有。我也试过了,没有前面的错误。我应该说得更清楚。你的服务器还在运行吗?你有什么要求吗?如果app.get“/”,则。。。甚至不工作,那么您的服务器可能未运行或未正确初始化。您的第二个代码块是正确的,如果其他事情都正确完成,它将正常工作。所以,如果第二个代码块不起作用,那么代码中还有一些错误,您还没有公开。我们必须查看您的代码的其余部分才能知道还有什么错误。您编写的第二个代码工作正常。确保您的服务器已关闭running@Mankind1023你可能在app.js的底部添加了你的中间件,对吗?因此请求一个不存在的URL确实触发了它,有没有办法让它在每次呼叫或至少每个路由上运行?@Mankind1023是的,将它移到上面声明路由的位置。好的,所以把它放在文件的顶部似乎就可以了,谢谢!
app.use(function(req, res, next){
  console.log("--------new middleware");
  next();
});
app.use(express.static(path.join(__dirname, 'public')));