express搭建后端服务器

2,563

前言

在一个互联网应用中,后端服务器扮演着相当重要的角色。在node.js出现之前,js的解析必须依赖浏览器,后端服务器基本上与它没什么关系。正是由于node.js的出现,使得javascript从浏览器当中剥离出来,它也拥有了能够编写后端服务器的能力。在这篇文章中,我们就来聊一聊使用JavaScript搭建后端服务器的框架——express。关于这个话题,我打算分成两大块来介绍:

  • 网络服务器概念相关
  • node和express

什么是网络服务器?

网络服务器(web server),可以指带硬件或软件,或者是它们协同工作的整体。  

网络服务器的硬件部分指的是一台提供网络服务,以及构成网站的各种资源文件(例如:html文档、js文件、css文件,以及其他的静态资源等)的计算机;网络服务器的软件部分指的是至少可以提供网络服务的应用程序,它包括控制网络用户如何访问托管文件的几个部分。能够理解URL(Uniform Resource Locator,统一资源定位符),并且能够解析HTTP(HyperText Transfer Protocol,超文本传输协议)的网络应用程序成为HTTP服务器(这里也就暗示了服务器的种类还有很多,比如:TCP服务器、UDP服务器等等)。在这篇文章中用到的服务器就是HTTP服务器。  

关于网络服务器,还需要了解的就是它的分类,它分为静态服务器和动态服务器。

  • 静态服务器(static web server):把它托管的文件原模原样的返回给浏览器的服务器。从静态服务器获取资源的过程可以理解成从仓库里面拿货物的过程,仓库里面的货物是什么样的,用户拿到的就是什么样的
  • 动态服务器(dynamic web server):它包括两个部分,静态服务器和一个额外的软件。该软件的功能是对静态服务器中的资源进行打包重组,然后生成新的资源在返回给客户端。

web应用的工作流程

如图所示,一个完整的web应用包含客户端和服务端两个部分。 web模型.png 任何一个web应用都是从客户端发起http请求开始的。服务端接受到http请求之后,将请求的数据告诉web应用程序,由应用程序来进行处理。应用程序通过从数据库中获取的数据,将html模板转换成可以返回到客户端的html文件,由浏览器解析并且显示。其中,应用程序就是服务器端的代码。在一个前后端分离的应用当中,服务端的代码分为两个部分,前端和后端。前端的代码负责整合资源,html页面渲染,动效设计等等;后端的代码负责数据库的CRUD操作,以及其他的业务。

nodeJS v.s. express

在这一部分,我们来捋一捋javascript、node.js和express这三者之间的关系。简单的来说,node.js是使javascript运行在服务端的工具,或者可以理解为一个解析javascript语言的一个平台。express是node.js搭建后端服务器的一个框架。也就是说,后两者的本质都是javascript。接下来,我做一下搬运工,搬运一下MDN文档中关于node的介绍和express的介绍:

  • node: Node(正式名称 Node.js)是一个开源的、跨平台的运行时环境,有了它,开发人员可以使用 JavaScript 创建各种服务器端工具和应用程序。此运行时主要用于浏览器上下文之外(即可以直接运行于计算机或服务器操作系统上)。据此,该环境省略了一些浏览器专用的 JavaScript API,同时添加了对更传统的 OS API(比如 HTTP 库和文件系统库)的支持。

  • express: Express 是最流行的 Node 框架,是许多其它流行 Node 框架 的底层库。它提供了以下机制:

    1. 为不同 URL 路径中使用不同 HTTP 动词的请求(路由)编写处理程序。
    2. 集成了“视图”渲染引擎,以便通过将数据插入模板来生成响应。
    3. 设置常见 web 应用设置,比如用于连接的端口,以及渲染响应模板的位置。
    4. 在请求处理管道的任何位置添加额外的请求处理“中间件”。

express 服务器搭建

安装express库

要想用express搭建web服务应用,第一步应该安装express库:

// 将express添加到依赖中
npm install express --save
// 暂时安装express而不添加到依赖列表中
npm install express --no-save

第一个express应用

废话不多说,直接贴代码:

const express = require('express')
const app = express()
const port = 3000

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

app.listen(port, () => {
  console.log(`Example app listening at http://localhost:${port}`)
})

这段代码的功能如下:

  1. 创建一个express应用
  2. 将该服务绑定到端口号为3000的端口上,使得当访问http://loaclhost:3000这个地址时,可以得到相应的应用程序
  3. 添加了一条路由,当访问根路径的时候,可以在浏览器的页面上看到"hello world"的字样 这段代码真的是麻雀虽小五脏俱全。我们来分析一下,代码的第一行const express=require('express')通过require的方法引入了express库,也可以采用import引入;代码的第二行const app=express()调用了express()函数,创建了一个express应用;然后,通过app.linson()将app绑定在3000这个端口上,并且在app上添加了一个app.get()方法,表示访问根路径的时候,返回"hello world"。

express常用方法介绍

  1. express():
    关于express(),官方文档的描述如下:

    Creates an Express application. The express() function is a top-level function exported by the express module. 按照惯例,通常用express()函数创建的应用都会命名为app

  2. aplication
    app对象是通过调用express()函数创建的。该对象的方法用于:
    • 路由HTTP请求
    • 配置中间件
    • 呈现HTML视图
    • 注册模板引擎 在实际的项目中常用的方法如下:
    • app.listen(port,[callback]):

    Starts a UNIX socket and listens for connections on the given path. This method is identical to Node’s http.Server.listen().

    • app.get(path,callback,[callback]):

    Routes HTTP GET requests to the specified path with the specified callback functions.

    • app.post(path,callback,[callback]):

    Routes HTTP POST requests to the specified path with the specified callback functions.

    • app.use([path],callback,[callback]):

    Mounts the specified middleware function or functions at the specified path: the middleware function is executed when the base of the requested path matches path.

  3. request
    req对象表示HTTP请求并具有请求query字符串、参数、body、HTTP请求头等属性。常用到的属性:
    • req.body
    • req.cookie
    • req.query
  4. response
    res对象表示HTTP响应,并且可以通过res.send()方法返回响应结果。常用到的方法有两个:
    • res.send(): 返回HTTP响应
    • res.status(): 设置返回相应的状态
  5. router
    关于router对象的描述,这里还是搬运官方文档的表述:

    A router object is an isolated instance of middleware and routes. You can think of it as a “mini-application,” capable only of performing middleware and routing functions. Every Express application has a built-in app router. A router behaves like middleware itself, so you can use it as an argument to app.use() or as the argument to another router’s use() method. The top-level express object has a Router() method that creates a new router object. Once you’ve created a router object, you can add middleware and HTTP method routes (such as get, put, post, and so on) to it just like an application. For example:

参考文献