`

NodeJS框架express之中间件及路由中间件

阅读更多

Express的中间件和路由中间件为路径映射及控制提供了更方便和强大的功能,本文将提供这些内容的使用指引。

 

中间件(Middleware)

中间件可以通过Connect传入express.createServer(),就像正常的连接服务器一样,比如:

var express = require('express');

var app = express.createServer(
    express.logger(),
    express.bodyParser()
);

另外,在configure()函数块中利用use()函数增加中间件,也是一种很好的方式。

app.use(express.logger({ format: ':method :uri' }));

通常连接中间件可以通过require(‘connect’)的方式,如:

var connect = require('connect');
app.use(connect.logger());
app.use(connect.bodyParser());

这让人感觉有些不太爽,于是express重新输出了(re-exports)这些中间件属性,但是在使用上保持了一致性:

app.use(express.logger());
app.use(express.bodyParser());

路由中间件(Route Middleware)

这里路径映射也可以理解为路由的意思,路由通过传入一个或多个附加的回调函数(或数组)到方法中,从而可以利用特定路由的中间件。该功能对限制访问以及加载路由使用的数据非常有用。

通常情况下异步数据的查询看起来像下面的样子,这里我们使用:id参数,并尝试获取一个用户。

app.get('/user/:id', function(req, res, next){
  loadUser(req.params.id, function(err, user){
    if (err) return next(err);
    res.send('Viewing user of csser.com ' + user.name);
  });
});

为了保持代码整洁并且提高可读性,我们可以在中间件内部应用该逻辑。正如你所看到的,将逻辑抽象到中间件里让我们达到一定程度的复用,同时代码更干净。

function loadUser(req, res, next) {
  // 这里提供假数据,你可以从数据库中获取真实用户信息
  var user = users[req.params.id];
  if (user) {
    req.user = user;
    next();
  } else {
    next(new Error('不存在的用户 ' + req.params.id));
  }
}

app.get('/user/:id', loadUser, function(req, res){
  res.send('正在查看用户 ' + req.user.name);
});

一回注:看到了吗?上面的路径映射的回调函数参数是可以支持多个的。

多重路由中间件可以被按照顺序来执行,从而可以实现更复杂的逻辑,比如限制访问某个用户的访问权限,下面的代码将只允许认证用户才可以编辑其帐号信息。

function andRestrictToSelf(req, res, next) {
  req.authenticatedUser.id == req.user.id
    ? next()
    : next(new Error('无权限'));
}

app.get('/user/:id/edit', loadUser, andRestrictToSelf, function(req, res){
  res.send('开始编辑用户 ' + req.user.name);
});

请记住中间件是简单的函数,我们还能定义返回中间件的函数,从而可以创建一个更有表现力和更易用的如下方案:

function andRestrictTo(role) {
  return function(req, res, next) {
    req.authenticatedUser.role == role
      ? next()
      : next(new Error('无权限'));
  }
}

app.del('/user/:id', loadUser, andRestrictTo('admin'), function(req, res){
  res.send('已删除用户 ' + req.user.name);
});

一回注:app.del的第三个参数之所以可以这样写,是因为其返回的是一个函数,而该函数可以访问’admin’的值,这里涉及到闭包的概念,如有疑问请在CSSer.com查找闭包相关文章。

通常使用的中间件的“栈”可以被作为数组(递归应用)传入,如此可以被混合并能匹配更复杂的功能。

var a = [middleware1, middleware2]
  , b = [middleware3, middleware4]
  , all = [a, b];

app.get('/foo', a, function(){});
app.get('/bar', a, function(){});

app.get('/', a, middleware3, middleware4, function(){});
app.get('/', a, b, function(){});
app.get('/', all, function(){});

可以去express源码仓库查看完整的路由中间件示例

分享到:
评论

相关推荐

    nodejs之express的中间件.docx

    本文将深入探讨Express中间件的概念及其在实际开发中的应用。 #### 二、Express中间件概述 Express中间件是一种特殊的函数,用于处理HTTP请求和响应周期。它们的工作方式类似于过滤器或拦截器,可以在请求到达路由...

    深入理解nodejs中Express的中间件.docx

    **中间件** 是 Express 框架的核心概念之一,它是执行特定任务的函数,这些函数可以在请求到达路由处理器之前或之后被调用。中间件可以访问请求对象 (`req`)、响应对象 (`res`) 以及应用程序中的其他对象。此外,...

    nodejs之express框架源码

    - 自定义中间件应遵循Express的中间件接口规范,以确保与框架的兼容性。 9. **Express的应用场景** - Express广泛应用于快速开发RESTful API、单页应用、API网关等场景。 - 它也常与Mongoose、Sequelize等数据库...

    你画我猜基于NodeJS的框架Express以及socketio

    《你画我猜游戏开发:基于NodeJS的Express与Socket.IO实践详解》 在Web开发领域,Node.js以其异步非阻塞I/O和高性能的特点,成为构建实时交互应用的热门选择。本篇文章将深入探讨如何利用Node.js的Express框架和...

    vue+nodejs+express+mybatis

    这个项目案例结合了前端的Vue.js框架、后端的Node.js与Express框架,以及数据库操作的MyBatis持久层框架,构建了一个完整的Web应用程序。下面将分别详细介绍这四个技术的核心概念、用途及它们如何协同工作。 **Vue....

    NodeJS+Express+MongoDB简单博客系统

    - Express.js框架的使用,包括路由、中间件和视图系统。 - MongoDB的文档型数据库模型和Mongoose库的使用。 - 前后端交互,如AJAX请求和JSON数据格式。 - Web安全基础,如防止跨站脚本攻击(XSS)和跨站请求伪造...

    uniApp+vue+nodejs+express+mysql电商项目.zip

    【标题】"uniApp+vue+nodejs+express+mysql电商项目"是一个综合性的Web开发实践,涵盖了前端、后端以及数据库等多个技术栈。在这个项目中,开发者将使用uniApp作为移动端应用框架,Vue.js作为前端框架,Node.js搭配...

    nodejs+express搭建自己的框架

    在“nodejs+express搭建自己的框架”这个主题中,我们将探讨如何利用Express的灵活性和模块化特性,定制适合自身需求的应用框架。首先,你需要安装Node.js和Express。在命令行中,使用npm(Node包管理器)安装...

    nodejs+express+mongodb+bootstrap+jquery+ejs写的电影demo

    标题中的“nodejs+express+mongodb+bootstrap+jquery+ejs写的电影demo”表明这是一个使用Node.js、Express框架、MongoDB数据库、Bootstrap前端框架、jQuery库以及EJS模板引擎开发的电影相关的应用程序示例。...

    nodejs+Express+mssql

    Express是基于Node.js平台的Web应用框架,它是构建Web应用最常用的选择之一。它简化了HTTP服务器的创建,提供了路由、中间件和视图系统等特性,使开发者能够快速搭建结构清晰、易于维护的Web应用。 **mssql** mssql...

    nodejs+express+mysql起步学习demo:待完善.zip

    Express是一个轻量级的Web应用框架,它为Node.js提供了许多便利的功能,如路由处理、中间件系统等。MySQL则是一种广泛使用的开源关系型数据库管理系统,适用于存储和检索大量数据。 在"nodejs+express+mysql起步...

    nodejs_express_module

    "nodejs_express_module" 提供的是 Express 框架的部署包,主要针对无法通过 npm(Node.js 的包管理器)正常安装的情况。这可能是因为网络问题,例如访问 npm 官方仓库时遇到的代理问题。在这种情况下,你可以通过...

    nodejs + express + mysql demo

    Express是基于Node.js的web应用框架,它简化了路由、中间件和视图的管理。在Express中,你可以定义路由来处理HTTP请求,使用中间件来处理请求和响应,以及设置模板引擎来渲染视图。例如: ```javascript const ...

    本文主要介绍NodeJS+Express+Mysql实现用户登录和注册。此登录注册的方式为ge

    Express是基于Node.js的一个Web应用框架,它简化了HTTP请求和响应的处理,提供了许多中间件来处理路由、视图系统、静态文件服务等,大大降低了开发复杂度。 MySQL则是一个关系型数据库管理系统,广泛应用于存储和...

    nodejs+express+mysql后台框架

    总的来说,这个"nodejs+express+mysql后台框架"提供了一个简洁、高效的起点,让开发者可以快速搭建起一个功能完善的后端服务,进行Web应用的开发。通过深入理解和定制这个框架,可以提高开发效率,降低维护成本,...

    NodeJS+express如何新建一个自己需要的项目

    Express则是Node.js的一个轻量级Web应用框架,它简化了构建Web服务的过程,使得开发者能够快速搭建功能丰富的Web应用程序。本篇文章将深入探讨如何使用Node.js和Express来创建一个自定义的项目。 1. **安装Node.js*...

    jinwei_nodejs_express

    该标题提到的"jinwei_nodejs_express"是一个基于Node.js的项目,它利用了Express框架进行开发。描述中指出,这个项目对Express进行了简单的封装,使得在使用时能够更便捷地实现多进程操作,特别是通过`cluster`模块...

    深入理解nodejs中Express的中间件

    在3.x版本中,很多中间件是基于Connect框架构建的,而在4.x版本中,Express将中间件独立出来,不再依赖Connect,这使得Express更加轻量级和灵活。 总结来说,中间件是Express的核心特性,它们构成了Express应用的...

    nodejs+express入门小例子

    Express.js则是基于Node.js的web应用框架,它简化了HTTP服务器的创建,提供了丰富的中间件系统,使得路由、请求处理和模板引擎的实现变得更加简单。中间件是Express的核心特性,它们按照定义的顺序执行,可以处理...

Global site tag (gtag.js) - Google Analytics