路由

路由是指应用程序的端点(URI)如何响应客户端请求。有关路由的介绍,请参阅基本路由

您可以使用Express app对象的方法定义路由,这些方法对应于HTTP方法; 例如,app.get()处理GET请求和app.post处理POST请求。有关完整列表,请参阅app.METHOD。您还可以使用app.all()来处理所有HTTP方法,并使用app.use()将中间件指定为回调函数(有关详细信息,请参阅使用中间件)。

实际上,路由方法可以有多个回调函数作为参数。使用多个回调函数时,重要的是提供next回调函数的参数,然后next()在函数体内调用以将控制权交给下一个回调。

以下代码是一个非常基本的路由示例。

var express = require('express')
var app = express() // 当发出GET请求时,返回“hello world”
app.get('/', function (req, res) {
res.send('hello world')
})

路线方法

路由方法是从其中一个HTTP方法派生的,并附加到express类的实例。

以下代码是为应用程序根目录的GET和POST方法定义的路由示例。

// GET 请求 路劲 路劲为 / 根路径 接口返回 GET request to the homepage
app.get('/', function (req, res) {
res.send('GET request to the homepage')
}) // POST 请求 路劲为 / 根路径 POST request to the homepage
app.post('/', function (req, res) {
res.send('POST request to the homepage')
})

Express支持与所有HTTP请求方法对应的方法:getpost等等。有关完整列表,请参阅app.METHOD

有一种特殊的路由方法,app.all()用于在路径上为所有 HTTP请求方法加载中间件函数。例如,无论是使用GET,POST,PUT,DELETE还是http模块支持的任何其他HTTP请求方法,都会对路由“/ secret”的请求执行以下处理程序。

// 只要是路劲带 /secret 的请求  都会执行此方法
app.all('/secret', function (req, res, next) {
console.log('Accessing the secret section ...')
next() // 将控制传递给下一个处理程序
})

路线路径

路径路径与请求方法相结合,定义可以进行请求的端点。路径路径可以是字符串,字符串模式或正则表达式(功能强大)。

字符?+*,和()是他们的正则表达式的对应的子集。连字符(-)和点(.)按字面顺序由基于字符串的路径解释。

如果你需要$在路径字符串中使用美元字符(),请将其包含在([和中])。例如,“ /data/$book” 处的请求的路径字符串将是“ /data/([\$])book”。

Express使用path-to-regexp来匹配路径路径; 有关定义路径路径的所有可能性,请参阅path-to-regexp文档。Express Route Tester是一个用于测试基本Express路由的便捷工具,但它不支持模式匹配。

查询字符串不是路径路径的一部分。

以下是基于字符串的路径路径的一些示例。

此路由路径将匹配对根路由的请求/

app.get('/', function (req, res) {
res.send('root')
})

此路径路径将匹配请求/about

app.get('/about', function (req, res) {
res.send('about')
})

此路径路径将匹配请求/random.text

app.get('/random.text', function (req, res) {
res.send('random.text')
})

以下是基于字符串模式的路径路径的一些示例。

此路线路径将匹配acdabcd

app.get('/ab?cd', function (req, res) {
res.send('ab?cd')
})

这条路线的路径将会匹配abcdabbcdabbbcd,等等。

app.get('/ab+cd', function (req, res) {
res.send('ab+cd')
})

这条路线的路径将会匹配abcdabxcdabRANDOMcdab123cd,等。

app.get('/ab*cd', function (req, res) {
res.send('ab*cd')
})

此路线路径将匹配/abe/abcde

app.get('/ab(cd)?e', function (req, res) {
res.send('ab(cd)?e')
})

基于正则表达式的路径路径示例:

此路径路径将匹配其中包含“a”的任何内容。

app.get(/a/, function (req, res) {
res.send('/a/')
})

这条路线的路径将匹配butterflydragonfly,但不butterflymandragonflyman等。

app.get(/.*fly$/, function (req, res) {
res.send('/.*fly$/')
})

路线参数

路径参数是命名的URL段,用于捕获在URL中的位置指定的值。捕获的值将填充在req.params对象中,路径参数的名称在路径中指定为其各自的键。

Route path: /users/:userId/books/:bookId
Request URL: http://localhost:3000/users/34/books/8989
req.params: { "userId": "34", "bookId": "8989" }

要使用路由参数定义路由,只需在路径路径中指定路由参数,如下所示。

app.get('/users/:userId/books/:bookId', function (req, res) {
res.send(req.params)
})

路径参数的名称必须由“单词字符”([A-Za-z0-9_])组成。

由于连字符(-)和点(.)按字面解释,因此它们可以与路由参数一起使用以用于有用的目的。

Route path: /flights/:from-:to
Request URL: http://localhost:3000/flights/LAX-SFO
req.params: { "from": "LAX", "to": "SFO" }
Route path: /plantae/:genus.:species
Request URL: http://localhost:3000/plantae/Prunus.persica
req.params: { "genus": "Prunus", "species": "persica" }

要更好地控制路由参数可以匹配的确切字符串,可以在括号(())中附加正则表达式:

Route path: /user/:userId(\d+)
Request URL: http://localhost:3000/user/42
req.params: {"userId": "42"}

因为正则表达式通常是文字字符串的一部分,所以请确保\例如使用额外的反斜杠转义任何字符\\d+

在Express 4.x中,正则表达式中*字符不以通常的方式解释。作为一种解决方法,请使用{0,}而不是*。这可能会在Express 5中修复。

路线处理程序

您可以提供多个回调函数,其行为类似于中间件来处理请求。唯一的例外是这些回调可能会调用next('route')以绕过剩余的路由回调。您可以使用此机制对路径施加前置条件,然后在没有理由继续当前路由的情况下将控制权传递给后续路由。

路由处理程序可以是函数,函数数组或两者的组合形式,如以下示例所示。

单个回调函数可以处理路由。例如:

app.get('/example/a', function (req, res) {
res.send('Hello from A!')
})

多个回调函数可以处理路径(确保指定next对象)。例如:

app.get('/example/b', function (req, res, next) {
console.log('the response will be sent by the next function ...')
next()
}, function (req, res) {
res.send('Hello from B!')
})

一组回调函数可以处理路由。例如:

var cb0 = function (req, res, next) {
console.log('CB0')
next()
} var cb1 = function (req, res, next) {
console.log('CB1')
next()
} var cb2 = function (req, res) {
res.send('Hello from C!')
} app.get('/example/c', [cb0, cb1, cb2])

独立函数和函数数组的组合可以处理路径。例如:

var cb0 = function (req, res, next) {
console.log('CB0')
next()
} var cb1 = function (req, res, next) {
console.log('CB1')
next()
} app.get('/example/d', [cb0, cb1], function (req, res, next) {
console.log('the response will be sent by the next function ...')
next()
}, function (req, res) {
res.send('Hello from D!')
})

响应方法

res下表中响应对象()的方法可以向客户端发送响应,并终止请求 - 响应周期。如果没有从路由处理程序调用这些方法,则客户端请求将保持挂起状态。

方法 描述
res.download() 提示下载文件。
重发() 结束响应过程。
res.json() 发送JSON响应。
res.jsonp() 使用JSONP支持发送JSON响应。
res.redirect() 重定向请求。
res.render() 渲染视图模板。
res.send() 发送各种类型的回复。
res.sendFile() 将文件作为八位字节流发送。
res.sendStatus() 设置响应状态代码并将其字符串表示形式作为响应主体发送。

app.route()

您可以使用创建路径路径的可链接路径处理程序app.route()。由于路径是在单个位置指定的,因此创建模块化路由很有帮助,同时减少冗余和拼写错误。有关路由的更多信息,请参阅:Router()文档

以下是使用定义的链接路由处理程序的示例app.route()

app.route('/book')
.get(function (req, res) {
res.send('Get a random book')
})
.post(function (req, res) {
res.send('Add a book')
})
.put(function (req, res) {
res.send('Update the book')
})

express.Router

使用express.Router该类创建模块化,可安装的路由处理程序。一个Router实例是一个完整的中间件和路由系统; 因此,它通常被称为“迷你应用程序”。

以下示例将路由器创建为模块,在其中加载中间件功能,定义一些路由,并将路由器模块安装在主应用程序中的路径上。

创建birds.jsapp目录中指定的路由器文件,其中包含以下内容:

var express = require('express')
var router = express.Router() // middleware that is specific to this router
router.use(function timeLog (req, res, next) {
console.log('Time: ', Date.now())
next()
})
// define the home page route
router.get('/', function (req, res) {
res.send('Birds home page')
})
// define the about route
router.get('/about', function (req, res) {
res.send('About birds')
}) module.exports = router

然后,在应用程序中加载路由器模块:

var birds = require('./birds')
// ...
app.use('/birds', birds)

该应用程序现在能够处理请求/birds/birds/about,以及调用timeLog中间件功能是特定的路线。

参考链接: http://www.expressjs.com.cn/guide/routing.html

Node.js + Express 接口请求(GET、POST、PUT)事例的更多相关文章

  1. body-parser Node.js(Express) HTTP请求体解析中间件

    body-parser Node.js(Express) HTTP请求体解析中间件 2016年06月08日     781     声明 在HTTP请求中,POST.PUT和PATCH三种请求方法中包 ...

  2. Node.js Express 框架学习

    转载:http://JavaScript.ruanyifeng.com/nodejs/express.html#toc0 感觉很牛的样子,不过觉得对初学者没太大用,里面很多例子用的api都没有详细的说 ...

  3. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  4. Windows下Node.js+Express+WebSocket 安装配置

    Linux参考: Linux安装Node.js 使用Express搭建Web服务器 Node.js是一个Javascript运行环境(runtime).实际上它是对Google V8引擎进行了封装.V ...

  5. Nodejs学习笔记(六)--- Node.js + Express 构建网站预备知识

    目录 前言 新建express项目并自定义路由规则 如何提取页面中的公共部分? 如何提交表单并接收参数? GET 方式 POST 方式 如何字符串加密? 如何使用session? 如何使用cookie ...

  6. Node.js Express框架

    Express 介绍 Express是一个最小的,灵活的Node.js Web应用程序框架,它提供了一套强大的功能来开发Web和移动应用程序. 它有助于基于Node Web应用程序的快速开发.下面是一 ...

  7. Nodejs学习笔记(六)—Node.js + Express 构建网站预备知识

    前言 前面经过五篇Node.js的学习,基本可以开始动手构建一个网站应用了,先用这一篇了解一些构建网站的知识! 主要是些基础的东西... 如何去创建路由规则.如何去提交表单并接收表单项的值.如何去给密 ...

  8. modeJS 深了解(1): Node.js + Express 构建网站预备知识

    转载:http://www.cnblogs.com/zhongweiv/p/nodejs_express_webapp1.html 目录 前言 新建express项目并自定义路由规则 如何提取页面中的 ...

  9. Node.js+Express+MongoDB数据库实现网页注册登入功能

    通过 Node.js + Express + MongoDB 实现网页注册账号 和 登入账号的功能 项目准备: 1: 事先准备好项目的页面 (首页页面 index.html)(登入页面 login.h ...

随机推荐

  1. Mysql视图、触发器、事务、储存过程、函数

    一.视图 什么是视图 视图是有一张表或多张表的查询结果构成的一张虚拟表 为什么使用视图 当我们在使用多表查询时 我们的sql语句可能会非常的复杂,如果每次都编写一遍sql'的话无疑是一件麻烦的事情,这 ...

  2. 【Luogu P2764】最小路径覆盖问题

    网络流 \(24\) 题之一. Problem Description 给出一个 \(n\) 个点 \(m\) 条边的 \(DAG\) ,求最小路径点覆盖,并输出路径选择方案. Input Forma ...

  3. PHP中SESSION自定义会话管理器

    <?php class CustomSession implements SessionHandlerInterface{ private $link; private $lifetime; p ...

  4. Vue--获取数据

    一.Jsonp抓取数据 用 npm 安装 jsonp npm install jsonp 创建 jsonp.js import originJsonp from 'jsonp' export defa ...

  5. mark mem

    韦达定理 http://baike.baidu.com/link?url=M45ozZEnQ4BtKD7l22WWgQuGnmDYV7TFynQcPEO2Tt8leYGhyEa1flt-RM34NG4 ...

  6. [qt]qstring和string中文支持转换问题

    QString str2qstr(const string str) { return QString::fromLocal8Bit(str.data()); } string qstr2str(co ...

  7. ABP配置模块扩展

    1.定义一个接口  里面是配置的属性等 public interface IMyConfiguration { int Id { get; set; } string Name { get; set; ...

  8. GridView实现拖拽排序以及数据交互

    在研究项目中的一个效果的时候,查找资料过程中发现有人有这么一种需求,就是GridView在实现拖拽排序的基础上,如果是两个GridView之间实现拖拽效果,并要实现数据交互. 一.效果图: 实现这个效 ...

  9. JAVA基础知识总结:十二

    一.String类 字符串是一种特殊的对象,一旦被初始化就不能被改变了 字符串常量存储于常量池中 二.StringBuffer类 是一个字符串缓冲区,相当于一个容器 特点 a.可以对字符串进行增加和删 ...

  10. nginx+php上传大文件配置

    //nginx- //上传文件大小限制,需在nginx.conf中配置 'client_max_body_size' => '500M', //php- //允许上传文件大小的最大值,需在php ...