浅谈nodejs服务器

927 阅读6分钟

服务器与客户端

  • 服务器: 能够提供网络服务的机器,通过安装特殊的软件来提供服务
  • 客户端:提供服务的是服务器,享受服务的是客户端

服务器的类型

  • web服务器:能够提供上网的服务
  • ftp服务器:能够提供文件下载、共享的服务
  • 数据库服务器:能够为其他电脑提供数据库的服务

web服务器能够干什么

  • 通过浏览器来享受web服务器提供的服务
  • 我们一般是用url地址来访问某个web服务器上的资源
  • 浏览器端发起请求,web服务器收到请求后,响应这个请求,并把结果返回给浏览器端
  • 浏览器与客户端是通过http(或者https)协议来进行请求和响应的

ip地址

1.作用:标识一个网络设备在某一个具体的网络当中的地址
2.分类:ipV4和ipV6
3.查看自己电脑的ip地址:打开命令提示窗,输入命令ipconfig,就可以看到了
4.127.0.0.1 特指本机ip地址

域名

  • ip地址的别名
  • localhost这个域名特指127.0.0.1这个地址

端口

  • 一个ip地址的端口可以有65536个
  • 不同的端口被不同的软件占用,提供不同的服务
  • 服务器要提供服务,必须提供指定的端口
  • 服务器与客户端之间都要通过端口来进行通信
  • 端口是可以编程分配

协议

  • 协议的双方:浏览器端与服务器端
  • 请求是由浏览器端发起的
  • HTTP协议中明确规定了请求数据响应数据的格式:
  • 浏览器请求资源要遵守http协议: 请求报文(请求行,请求头,请求体)
  • 服务器返回资源要遵守http 协议: 响应报文(响应行,响应头,响应体)

客户端访问服务器的流程

1.用户输入域名
2.DNS解析:把域名解析成ip
3.浏览器端按ip地址发起请求
4.服务器端检查端口
5.服务器端找到服务程序
6.服务器端处理请求并返回响应给浏览器端

用nojs的核心模块http写一个简单的web服务器

// 1. 引入http模块
const http = require('http');

// 2. 创建服务
//每次收到请求,回调都会执行
const server = http.createServer(function (req, res) {
    console.log('有人来访问了')
    // 向客户端发送内容,并结束本次响应
    res.end('hello world')
});
// 3. 启动服务
server.listen(8081, function () {
    console.log('服务器启动成功,请在http://localhost:8081中访问....');
});

下面是输出在页面的结果: image.png 注意

  • 小黑窗不要关闭,它就是服务器
  • 服务器本身不会有主动行为,它在时刻等待客户端的访问
  • 不要用鼠标选中小黑窗的内容,会导致程序假死
  • 修改代码后要重启

image.png

理解请求和响应

请求:当web服务器准备好以后,如果没有客户端来访问它,它不会有任何的效果,回调函数也不会执行,客户端每次发起请求,回调函数都会执行一次
响应:通过res.end来设置响应的内容,res.end()的格式只是能是buffer或者是String

不同的浏览器返回不同的内容

  • 属性:req.url()获取端口号后面的请求的资源地址
  • req.url一定是以/开头的
  • 在现代浏览器中,它们会自动去请求服务器上的favicon.ico

content-type属性

1.作用:在http协议中,content-type用来告诉对方本次传输的数据的类型是什么
2.在请求头中设置content-type来告诉服务器,本次请求携带的数据是什么类型的
3.在响应头中设置content-type来告诉浏览器,本次返回的数据是什么类型的

常见的几种几种文件类型以及content-type属性

-   .html`res.setHeader('content-type', 'text/html;charset=utf8')`
-   .css`res.setHeader('content-type', 'text/css;charset=utf8')`
-   .js`res.setHeader('content-type', 'application/javascript')`
-   .png`res.setHeader('content-type', 'image/png')`
-   json数据:`res.setHeader('content-type', 'application/json;charset=utf-8')`

格式:res.setHeader('content-type', 值)

设置statusCode

  • 作用:就是http的响应状态码
  • 格式:res.statusCode = 值

.html文件中的二次请求

从服务器获取html文件之后,如果这个html文件中还引用了其它的外部资源(图片,样式文件等),则浏览器会重新再发请求,这个就是二次请求。

image.png 下面是输出到页面的内容 image.png

image.png

express

  • Express 是一个基于 Node.js 平台,快速、开放、极简的 web 开发框架。
  • 我们前面用http模块来支持web服务,现在要用express来写web服务
  • 对于node.js来说,Express 是一个第三方模块,有丰富的 API 支持,强大而灵活的中间件特性
  • Express 不对 Node.js 已有的特性进行二次抽象,只是在它之上扩展了 Web 应用所需的基本功能 中间件的理解:
    可以为用户提供更好的服务
    可以比较方便的拆卸

运行第一个express程序

  1. 我们先创建一个空的文件夹,并对这个文件夹项目初始化
  2. 下载express包
  3. 在这个文件夹的根目录下面创建一个.js文件 下面的步骤:
// 1. 引入我们下载的express包
const express = require('express')

// 2. 调用 express() 得到一个 app
//    类似于 http.createServer()
const app = express()


// 3. 设置请求对应的处理函数
//    当客户端以 GET 方法请求 / 的时候就会调用第二个参数:请求处理函数
app.get('/', (req, res) => {
    res.send('hello world')
})

// 3. 监听端口号,启动 Web 服务
app.listen(8022, () => console.log('服务启动成功'))

托管静态资源-web服务器

  • 让用户直接访问静态资源是一个web服务器最基本的功能
  • 例如,如上url分别是请求一张图片,一份样式文件,一份js代码。我们实现的web服务器需要能够直接返回这些文件的内容给客户端浏览器
  • 在前面学习http模块时,我们已经实现了这些功能了,但是要写很多代码,现在使用express框架,只需一句代码就可以搞定了,这句代码是  app.use(express.static('public'))
// 2. 设置请求对应的处理函数
app.use(express.static('public'))
  • 此时,所有放在public下的内容可以直接访问

路由和接口

格式:

const app = express();

// 定义路由
app.METHOD(PATH, HANDLER)

注意:

  • app 是 express 实例 。(const app = express())
  • METHOD 是一个 HTTP 请求方法。 全小写格式。如:post,get,delete等
  • PATH 是请求路径(相当于在http模块中用到过的 url.parse(req.url).pathnameHANDLER 是当路由匹配到时需要执行的处理函数。(req,res)=>{ }

浏览器的url和服务器的路径

浏览器url服务端路径
http://localhost:8080/
http://localhost:8080/public/a/index.html/public/a/index.html
http://localhost:8080/index.html?a=1&b=2/index.html