Express文档翻译学习

1. 入门

高度包容、快速而极简的 Node.js Web 框架

1.1 安装

npm install express --save

1.2 hello world

  1. 创建名为 app.js 的文件,然后添加以下代码
var express = require('express');
var app = express();

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

app.listen(3000, function () {
  console.log('Example app listening on port 3000!');
});

注释: 此应用程序以“Hello World!”响应针对根 URL (/)路由的请求。对于其他所有路径,它将以 404 Not Found 进行响应。

1.3 Express 生成器

可使用应用程序生成器工具 (express) 快速创建应用程序框架。

  1. 安装express-generator生成器
    (1) 全局安装:npm i express-generator -g
    (2) 查看命令:express -h
    (3) 查看版本:express --version
  2. 创建名为 serverExpress应用程序
    express server
  3. 安装依赖
    cd server
    npm install
  4. 启动程序
    npm start
  5. 项目文件介绍
  • bin/www 项目入口文件
  • public 资源文件
  • routes 路由
  • views 视图
  1. 使用html模板替换jade模板
  • 安装ejs
    npm i ejs --save
  • 修改app.js
const ejs = require('ejs');

//app.set('view engine', 'jade');
app.engine('.html', ejs.__express);
app.set('view engine', 'html');

1.4 基本路由

  1. 路由用于确定应用程序如何响应对特定端点的客户机请求。
  2. 每个路由可以具有一个或多个处理程序函数,这些函数在路由匹配时执行。
  3. 路由定义采用以下结构:
    app.METHOD(PATH, HANDLER)
    其中:appexpress 的实例。METHODHTTP 请求方法PATH 是服务器上的路径。HANDLER 是在路由匹配时执行的函数。
  4. 简单路由演示
  • 以主页上的 Hello World! 进行响应:
app.get('/', function (req, res) {
  res.send('Hello World!');
});
  • 在根路由 (/) 上(应用程序的主页)对 POST 请求进行响应:
app.post('/', function (req, res) {
  res.send('Got a POST request');
});
  • /user 路由的 PUT 请求进行响应:
app.put('/user', function (req, res) {
  res.send('Got a PUT request at /user');
});
  • /user 路由的 DELETE 请求进行响应:
app.delete('/user', function (req, res) {
  res.send('Got a DELETE request at /user');
});

1.5 静态文件

  1. 为了提供诸如图像、CSS 文件和 JavaScript 文件之类的静态文件,请使用 Express 中的 express.static内置中间件函数。
  2. 将包含静态资源的目录的名称传递给 express.static 中间件函数,以便开始直接提供这些文件。例如,使用以下代码在名为public的目录中提供图像、CSS 文件和 JavaScript 文件:
app.use(express.static('public'));
  1. 可以访问位于 public 目录中的文件
    http://localhost:3000/images/kitten.jpg
    http://localhost:3000/css/style.css
    http://localhost:3000/js/app.js
    http://localhost:3000/images/bg.png
    http://localhost:3000/hello.html
  2. 要使用多个静态资源目录,请多次调用express.static 中间件函数:
app.use(express.static('public'));
app.use(express.static('files'));
  1. express.static函数提供的路径相对于您在其中启动 node 进程的目录。如果从另一个目录运行 Express应用程序,那么对于提供资源的目录使用绝对路径会更安全:
app.use('/static', express.static(__dirname + '/public'));

1.6 常见问题及解答

  1. 如何定义模型?
    Express 没有数据库概念。此概念留给第三方 Node 模块实现,因此可以接入几乎任何数据库。
  2. 如何处理 404 响应?
    Express 执行了所有中间件函数和路由,且发现它们都没有响应。您需要做的只是在堆栈的最底部(在其他所有函数之下)添加一个中间件函数来处理 404 响应:
app.use(function(req, res, next) {
  res.status(404).send('Sorry cant find that!');
});
  1. 如何设置错误处理程序?
    错误处理中间件的定义方式与其他中间件基本相同,差别在于错误处理中间件有四个自变量而不是三个,专门具有特征符(err, req, res, next)
app.use(function(err, req, res, next) {
  console.error(err.stack);
  res.status(500).send('Something broke!');
});

注意:错误处理中间件始终采用四个自变量。必须提供四个自变量,以将函数标识为错误处理中间件函数。否则,next 对象将被解释为常规中间件,从而无法处理错误。

2. 指南

3. API参考

3.1 express()

Methods

express.json()
express.static()
express.Router()
express.urlencoded()

3.2 Application

Properties

app.locals
app.mountpath

Events

mount

Methods

app.all()
app.delete()
app.disable()
app.disabled()
app.enable()
app.enabled()
app.engine()
app.get()
app.get()
app.listen()
app.METHOD()
app.param()
app.path()
app.post()
app.put()
app.render()
app.route()
app.set()
app.use()

3.3 Request

Properties

req.app
req.baseUrl
req.body

包含在request body请求体中提交的键-值对数据。默认情况下,它是 undefined。在你使用body解析中间件时才会被填充,例如:body-parser 或者 multer
下面这个例子展示了如何使用body解析中间件来填充req.body

var app = require('express')();
var bodyParser = require('body-parser');
var multer = require('multer'); 

app.use(bodyParser.json()); // for parsing application/json
app.use(bodyParser.urlencoded({ extended: true })); // for parsing application/x-www-form-urlencoded
app.use(multer()); // for parsing multipart/form-data

app.post('/', function (req, res) {
  console.log(req.body);
  res.json(req.body);
})
req.cookies

当使用 cookie-parser 中间件时,此属性是一个包含由请求发送的cookie的对象。如果请求不包含cookie,则默认为{}

// Cookie: name=tj
req.cookies.name
// => "tj"

如果cookie已经签名,则必须使用req.signedCookies
有关更多信息、问题或关注,请参阅cookie-parser

req.fresh
req.hostname
req.ip
req.ips
req.method
req.originalUrl
req.params
  1. 返回一个匹配路由参数的object对象。例如,如果路由路径为/user/:name,那么可以通过req.params.name取到name字段值。默认返回值为空对象{}
// GET /user/tj
req.params.name
// => "tj"

注意:与vue-router用法类似。

  1. 如果在路由中定义了正则表达式,使用req.params[n]可以获取捕获组。其中,n表示第n个捕获组。该规则适用于未定义通配符匹配的字符串路由,例如:/file/*
// GET /file/javascripts/jquery.js
req.params[0]
// => "javascripts/jquery.js"
  1. 如果需要在req.params中对参数进行更改,可以使用app.param处理程序。 更改仅适用于路由路径中已定义的参数。
  2. 在中间件或路由处理程序中对req.params对象所做的任何更改都将被重置。
  3. Express将自动解码req.params中的值。(使用decodeURIComponent)。
req.path
req.protocol
req.query

一个包含路由中每个查询字符串参数的属性的对象。如果没有查询字符串,就是一个空对象{}

// GET /search?q=tobi+ferret
req.query.q
// => "tobi ferret"

// GET /shoes?order=desc&shoe[color]=blue&shoe[type]=converse
req.query.order
// => "desc"

req.query.shoe.color
// => "blue"

req.query.shoe.type
// => "converse"
req.route
req.secure
req.signedCookies
req.stale
req.subdomains
req.xhr

Methods

req.accepts()
req.acceptsCharsets()
req.acceptsEncodings()
req.acceptsLanguages()
req.get()
req.is()
req.param()

已经被废弃,推荐直接使用req.paramsreq.bodyreq.query

返回当前“name”参数的值。

// ?name=tobi
req.param('name')
// => "tobi"

// POST name=tobi
req.param('name')
// => "tobi"

// /user/tobi for /user/:name 
req.param('name')
// => "tobi"

查找的顺序如下:

  • req.params
  • req.body
  • req.query

如果在任何请求对象中都没有找到参数,您可以指定defaultValue来设置默认值。
必须使用body解析中间件,以便req.param()可以正常工作。 更多细节参考:req.body

req.range()

3.4 Response

Properties

res.app
res.headersSent
res.locals

Methods

res.append()
res.attachment()
res.cookie()

res.cookie(name, value [, options])
设置cookie键值对,value参数可以是一个字符串或者可以转化为json的对象。options参数是一个包含以下属性的对象。

属性 类型 描述
domain String cookie的域名。默认为应用程序的域名。
encode Function 用于cookie值编码的同步函数。默认为“encodeURIComponent”。
expires Date 相对于GMT标准的过期时间。如果没有指定或设置为0,则创建会话cookie。
httpOnly Boolean 是否只能由web服务器访问的cookie标记。
maxAge Number 用于设置相对于当前时间(以毫秒为单位)的到期时间。
path String cookie存储路径,默认为 “/”。
secure Boolean 标记cookie仅允许被https请求使用。
signed Boolean 表明cookie是否被签名。
sameSite Boolean or String 参考
res.cookie('name', 'tobi', { domain: '.example.com', path: '/admin', secure: true });
res.cookie('rememberme', '1', { expires: new Date(Date.now() + 900000), httpOnly: true });
res.clearCookie()

res.clearCookie(name [, options])
清除由名称指定的cookie。有关options对象的详细信息,请参阅res.cookie()

res.cookie('name', 'tobi', { path: '/admin' });
res.clearCookie('name', { path: '/admin' });
res.download()
res.end()
res.format()
res.get()
res.json()
res.jsonp()
res.links()
res.location()
res.redirect()
res.render()
res.send()
res.sendFile()
res.sendStatus()
res.set()
res.status()
res.type()
res.vary()

3.5 Router

Methods

router.all()
router.METHOD()
router.param()
router.route()
router.use()

参考资料

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350