Nodejs Express2.5.* 中间件验证一直没用,求指点

Nodejs Express2.5.* 中间件验证一直没用,求指点

app.configure(‘development’, function() {
app.use(require(’./controllers/msign’).auth_user);
app.use(express.errorHandler({
dumpExceptions: true,
showStack: true
}));
});

当网页调用的时候,不会先去调用这个方法 `

app.use(require('./controllers/msign').auth_user);

是不是忘记什么了?`


3 回复

针对你提到的Node.js和Express 2.5.*版本中的中间件问题,确实可能存在一些配置上的疏忽。首先,我们需要确保的是,中间件的注册顺序以及中间件函数本身的正确性。

在Express中,中间件的执行顺序非常关键。你需要确保你的认证中间件在其他路由之前被加载,这样它才能在请求到达具体的路由处理函数之前进行检查。

此外,在Express 2.5.*版本中,中间件的写法可能需要一些特定的格式来确保其正常工作。让我们来看一个简单的例子,展示如何创建并使用一个自定义的认证中间件。

示例代码

假设我们有一个位于./controllers/msign.js的文件,其中包含一个名为auth_user的中间件函数:

// controllers/msign.js
exports.auth_user = function(req, res, next) {
  // 这里可以添加任何你需要的认证逻辑
  if (req.session && req.session.user) {
    return next(); // 认证通过,继续处理下一个中间件或路由
  } else {
    res.send(401, 'Unauthorized'); // 如果没有通过认证,则返回401状态码
  }
};

接下来,我们需要在主应用文件(如app.js)中正确地注册这个中间件,并确保它在其他路由之前被调用。以下是一个示例配置:

// app.js
var express = require('express');
var msign = require('./controllers/msign');

var app = express();
app.configure(function() {
  app.use(express.cookieParser());
  app.use(express.session({ secret: 'your-secret-key' })); // 确保你已经设置了session
  app.use(msign.auth_user); // 注册认证中间件
  app.use(app.router); // 确保所有路由都在认证中间件之后定义
});

// 假设我们有一个简单的路由
app.get('/', function(req, res) {
  res.send('Hello, authenticated user!');
});

// 启动服务器
app.listen(3000);

在这个例子中,我们首先解析cookie和设置session,然后使用自定义的auth_user中间件进行认证检查。只有通过认证的用户才能访问后续的路由。

确保你的认证逻辑是正确的,并且在请求到达实际的路由处理程序之前被执行。如果问题仍然存在,建议检查日志输出,以确定中间件是否被正确调用。


囧, 自己发现问题了。 use 加载顺序非常重要。

  app.use(express.cookieParser());
  app.use(express.session({
    secret: config.session_secret
  }));
  app.use(require('./controllers/msign').auth_user);

这样的顺序就ok。。。伤心~

根据你的描述,问题可能在于中间件的配置顺序或者中间件的编写方式。在Express中,中间件的执行顺序是非常重要的。通常情况下,你需要确保认证中间件在路由处理之前被加载。

示例代码

假设你有一个简单的认证中间件 auth_user,你可以这样配置:

var express = require('express');
var app = express();

// 加载认证中间件
app.use(require('./controllers/msign').auth_user);

// 其他中间件
app.use(express.static(__dirname + '/public'));

// 路由定义
app.get('/', function(req, res) {
  res.send('Hello World!');
});

// 错误处理中间件
app.use(express.errorHandler({
  dumpExceptions: true,
  showStack: true
}));

var port = process.env.PORT || 3000;
app.listen(port, function() {
  console.log('Listening on port ' + port);
});

解释

  1. 中间件顺序:确保 auth_user 中间件在静态文件服务中间件之前加载。
  2. 中间件编写:确保 auth_user 中间件的编写正确。一个简单的中间件示例如下:
module.exports.auth_user = function(req, res, next) {
  // 进行用户认证逻辑
  if (!req.session.user) {
    return res.redirect('/login');
  }
  next(); // 如果认证通过,则继续执行下一个中间件或路由处理器
};

可能的问题

  • 认证逻辑错误:检查 auth_user 中间件中的认证逻辑是否正确。
  • 中间件未正确加载:确认 ./controllers/msign 文件存在并且导出了正确的中间件函数。

如果你已经按照上述步骤操作但仍然有问题,请提供更多的错误信息或者中间件的具体实现细节,以便进一步排查问题。

回到顶部