四、node服务器搭建
什么是端口
一台电脑可以部署多个服务器,根据端口不同找到不同的服务器。
默认的http
端口为80端口。
web服务器读取网页并返回
- 使用
http
模块开启一个服务器 - 在服务器内部读取文件,将读取到的字符串内容作为服务器的响应返回
1 | const http = require("http"); |
静态服务器的实现
静态服务器的流程
浏览器向服务器发起请求
服务器查询受否存在这个文件
存在
返回
不存在
返回默认404页面
静态服务器的实现
静态服务器实现与读取网页返回几乎一致,通过request.url
可以获取用户访问的路径。
1 | const http = require("http"); |
接收前端传来的get参数
get参数是与url拼接在一起的,因此可以使用url.parse
方法解析字符串。
1 | const http = require("http"); |
接收前端传来的post参数
接收post数据需要为请求体注册data
事件与end
事件。前者表示接收数据,回调函数内参数传入数据,函数体处理数据;后者表示接收完数据后调用的回调函数。
处理接收的数据使用querystring.parse
可以将接收的数据转换为对象形式。
1 | const http = require("http"); |
GET与POST的区别
GET | POST | |
---|---|---|
传值 | 通过url传值 | 通过请求体(querystring) |
数据大小 | 相对较少 | 将对较大 |
安全性 | 相对较低 | 相对较高 |
一般用途 | 请求数据、获取数据 | 提交数据 |
爬虫示例
使用第三方模块的步骤:
新建一个文件夹(非中文且不能与模块名相同)
npm init -y
进行初始化下载模块
可以到npm官网搜索
使用模块
参照模块说明文档
爬取丁香园的body数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22const fs = require("fs");
var Crawler = require("crawler");
var c = new Crawler({
maxConnections: 10,
callback: function (err, res, done) {
if (err) {
console.log(err);
} else {
var $ = res.$;
fs.writeFile("./temp/1.txt", $("body").text(), (err) => {
if (err == null) {
console.log("成功");
}
});
}
done();
},
});
c.queue("https://ncov.dxy.cn/ncovh5/view/pneumonia");爬取一张图片
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22var Crawler = require("crawler");
var fs = require("fs");
var c = new Crawler({
encoding: null,
jQuery: false, // set false to suppress warning message.
callback: function (err, res, done) {
if (err) {
console.error(err.stack);
} else {
fs.createWriteStream(res.options.filename).write(res.body);
}
done();
},
});
c.queue({
uri: "https://ae01.alicdn.com/kf/H21b5f6b8496141a1979a33666e1074d9x.jpg",
filename: "./temp/test.jpg",
});
npm命令的使用
安装当前目录下的项目所需要的所有依赖包
npm install
如果下载过程中卡住,可以使用
npm cache clean -f
清除缓存使用淘宝镜像
pakeage与pakeage-lock的区别
使用npm5之前的版本,是不会生成
package-lock.json
这个文件的。npm5以后,包括npm5这个版本,才会生成
package-lock.json
文件当使用npm安装包的时候,npm都会生成或書更新
package-lock.json
文件npm5以后的版本,在安装包的时候,不需要加
--save(s)
参数,也会自动在package.json
中保存依项当安装包的时候,会自动创建或更新
package-jock.json
文件package-lock.json
文件内保存了node_modules
:中所有包的信息,包含这些包的名称、版本号、下地址。带来好处是,如果重新npm install
的时候,就无逐个分析包的依赖项,因比会大大加快安装速度从
package-lock.json
文件名来看,Iock代表的是"锁定"的意思。它用来物定当前开发使用的版本号,防止npm install
的时侯自动更新到了更新版本。因为新版本有可能会更新老的API,导数之前的代码出错原来的
package.json
文件只能定大版本,也就是版本号的第一位,并不能定后面的小版本,你每次npm install
都是拉取的该大版本下的最新的版本,为了稳定性考虑我们几手是不敢随意升级依包的,这将导数多出来很多工作量,测试/适配等,所以package-lock.json
文件出来了,当你每次安装一个依赖的候就定在你安装的这个版本。
使用express模块
GET与POST传参:
GET传参–接收参数
只需要在请求体内直接通过
request.query
即可取到传参对象POST参数–接收参数
需要导入
body-parser
模块,首先对url进行转码,然后在请求体内可以通过request.body
获取传参对象
创建一个简单的服务器
1 | const express = require("express"); |
创建一个静态资源服务器
创建静态资源可以设置静态目录app.use(express.static("PATH"));
1 | const express = require("express"); |
实现一个简单的get接口
1 | const express = require("express"); |
返回JSON
返回json直接返回一个对象即可。
1 | const express = require("express"); |
实现一个带有参数的GET接口
通过req.query
可以获取传输的参数对象,然后取到具体的内容。
1 | const express = require("express"); |
实现简单的POST接口
1 | const express = require("express"); |
带参数的POST接口
在post请求中,无法使用req.query
拿到请求的数据。所以拿到数据需要使用第三方模块body-parser
模块。
将请求体解析
app.use(bodyParser.urlencoded({ exrtended: false }));
通过
req.body
拿到请求的数据
1 | const express = require("express"); |
返回是json格式字符串的接口
使用express
模块返回字符串默认为text/html
格式,设置响应头后即可返回json格式的字符串。
1 | const express = require("express"); |
POST传文件参数
post接收文件参数需要使用multer
模块,然后将传过来的文件放在此模块创建的文件夹下。
请求第二个可选参数为接收文件的键值。通过req.file
获取文件信息,通过req.body
获取一同传输的文本信息。
1 | const express = require("express"); |