Node.js学习(1)

前面

前端学习了一段时间,差不多可以学一些后端知识了。身边有黄佬写后端用PHP,还有树神写后端用python,所以我选择了node.js。

1. 安装

node.js安装直接在官网下载就行,我下的是LTS。

2. 介绍

https://nodejs.org/en/about/

3. 开始

在vscode创建一个js文件

1. 创建服务器

1
2
3
4
5
6
7
8
9
const http=require('http');

var server=http.createServer(function(req,res){
res.write("你好,欢迎访问");
res.end();
});

//监听+端口
server.listen(8088);

其中http是一个包,其中有很多功能,然后声明一个server为http.createServer(){}这个函数,并在其中构造一个回调函数,每当有浏览器访问8088这个端口时,服务器响应给浏览器显示"你好,欢迎访问",然后res.end();表示本次响应结束。

2. 文件操作

node.js的有些文件操作关键字和终端文件操作很相似。

1
2
3
fs.readFile(文件位置,回调函数(err,data){});
fs.writeFile(文件位置,内容,回调函数(err,data){
});

更多参数

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const http = require('http');    //const相当于全局静态声明变量
const fs = require('fs');

var server = http.createServer(function (req,res) {
//req.url表示浏览器发来的链接请求
//req.url=>'/sign.html' 然后读取frontend/YJ/sign.html
//前面的位置为前端页面的位置
var file_name='../frontend/YJ/'+req.url;
fs.readFile(file_name,function(err,data){
/*fs的回调函数有两个关键的值:err和data,err表示当访问错误时要出现什么
* data表示显示的数据,一般为网页等
*/
if(err){
res.write('404'); //相应出现404
}else{
res.write(data); //相应出现数据,可以是网页也可以为别的
}
res.end(); //注意这个响应结束需要放在读文件函数内部,因为是异步处理
})
});

//监听--等待有人来访问
//端口8080
server.listen(8080);

3.数据接收

不管前台属于那种数据 -> form,ajax,jsonp

对于后台来说 -> 都一样。

请求方式:

  1. get 数据在url中一起传输
  2. post 不在url中

发送的数据有head(url:<32KB)也有body(post:1G)。

get

querystring模块(低优先,不常用)

querystring可以将URL中的字符串自动解析或格式化

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
const http = require('http');    //const相当于全局静态声明变量,用来导入各模块
const fs = require('fs');
const querystring=require('querystring');

var server = http.createServer(function (req,res) {
//req.url表示浏览器发来的链接请求
//req.url=>'/sign.html' 然后读取frontend/YJ/sign.html
//前面的位置为前端页面的位置
var file_name='../frontend/frontend_node/'+req.url;
var get={};
if(req,url=null){
file_name='../frontend/frontend_node/index.html'
}
fs.readFile(file_name,function(err,data){
/*fs的回调函数有两个关键的值:err和data,err表示当访问错误时要出现什么
* data表示显示的数据,一般为网页等
*/
if(err){
res.write('404'); //相应出现404
}else{
res.write(data); //相应出现数据,可以是网页也可以为别的
}
res.end(); //注意这个响应结束需要放在读文件函数内部,因为是异步处理
})

if(req.url.indexOf('?')!=-1){ //判断是否有?这个断点
var arr=req.url.split('?');//拆分url
var url=arr[0];//前面地址存入arr[0],
get=querystring.parse(arr[1]);//后面数据存入arr[1]中
console.log(url,get);
res.end();

}
});

//监听--等待有人来访问
//端口8080
server.listen(8080);

querystring.parse()可以直接解析url后面的get内容

上面代码输出结果为

1
/ [Object: null prototype] { user: 'asdasd', pass: 'asdasd' }

url模块(高优先,常用)

url模块可以说是比querystring多了更多的功能,直接解析一个url的全部信息

code:

1
2
3
4
5
6
7
8
9
10
11
const http=require('http');
const urllib=require('url');

var server=http.createServer(function(req,res){
var obj=urllib.parse(req.url,true);
var url=obj.pathname;
var get=obj.query;
console.log(url,get);
res.write("hahaha");
res.end();
}).listen(8888);

html:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Node.js</title>
</head>
<body>
<form action="http://localhost:8888/hahaha" method="get">
<span>用户:</span>
<input type="text" name="user">
<span>密码:</span>
<input type="password" name="pass">
<input type="submit" value="提交">
</form>
</body>
</html>

url的.parse包含了很多参数,其中.pathname 是表示url后面转到的路径,.query表示get到的数据并自动将其转化为json格式。可以从html文件打开直接输入提交,提交上去后会直接转到hahaha后面携带参数的页面上。并且在控制台输出url和get的数据。

post

post——分段传送(防止数据传送出错全部重传)

一般用querystring 接收。

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
const http=require('http');
const querystring=require('querystring');

var server=http.createServer(function(req,res){
//post--req
//data--有一段数据到达(有很多数据)
var str='';//用来储存接受到的数据
res.on('data',function(data){
var i=0;
str+=data;
console.log('第${i++}次收到数据');//计数
});
//end表示数据全部到达(一次)
res.on('end',function(){
var post=querystring.parse(str)
console.log(post);//打印全部数据
});
var i;
}).listen(8888);

整合

code:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
const http=require('http');
const fs=require('fs');
const querystring=require('querystring');
const urllib=require('url');

var server=http.createServer(function(req,res){
//get
var oj=urllib.parse(req.url,true);
var get=oj.query;
var url=oj.pathname;
//post
var str='';
req.on('data',function(data){
str+=data;
});
req.on('end',function(){
var post=querystring.parse(str);
console.log(url,get,post);
//文件请求
var file_name="../frontend/YJ"+url;
fs.readFile(file_name,function(err,data){
if(err){
res.write('404');
}else{
res.write(data);
}
res.end();
});
});
}).listen(8080);

接口就类似于:

注册:http://localhost:8080/user?reg&user=chenzhuo&pass=123456 然后带个json:{“ok”:true,“msg”:“注册”}

登陆:http://localhost:8080/user?login&user=aaa&pass=131231 然后带个json:{“ok”:true,“msg”:“登陆”}

然后完整模拟做一个后台程序(没有ajax.js)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
const http=require('http');
const fs=require('fs');
const querystring=require('querystring');
const urllib=require('url');

var users={};//接口暂时储存的容器

var server=http.createServer(function(req,res){
//get
var oj=urllib.parse(req.url,true);
var get=oj.query;
var url=oj.pathname;
//post
var str='';
req.on('data',function(data){
str+=data;
});
req.on('end',function(){
var post=querystring.parse(str);
//console.log(url,get,post);
//接口

if(url=='/user'){
//emm是自己命名的参数,只要前后台相同即可
switch(get.emm){
//注册
case 'reg':
//用户名是否已经存在
if(users[get.user]){
res.write('{"ok":flase,"msg":"此用户已注册"}');
}else{//输入user
users[get.user]=get.pass;
res.write('{"ok":true,"msg":"注册成功"}');
}
break;
//登陆
case 'login':
//用户名是否已经存在
if(users[get.user]==null){
res.write('{"ok":flase,"msg":"此用户不存在"}');
}else if(users[get.user]==get.pass){//检查密码
res.write('{"ok":flase,"msg":"用户或密码错误"}')
}else{
res.write('{"ok":true,"msg":"登陆成功"}');
}
break;
default:
res.write('{"ok"=false,"msg"="未知的emm"}');

}
res.end();
}else{
//文件请求
var file_name="../frontend/YJ"+url;
fs.readFile(file_name,function(err,data){
if(err){
res.write('404');
}else{
res.write(data);
}
res.end();
});
}
});
}).listen(8080);

模块

自定义模块

1
2
3
4
5
6
7
8
9
10
/*require -- 引入模块
exports --输出
module -- 一次输出一堆东西
require如果有./则从自定义模块里找,如果没有则在系统模块找
优先级:系统模块 > 自定义模块
*/

const mod1=require('./mod');

console.log(mod1.a,mod1.b,mod1.c);

mod.js:

1
2
3
4
/*
exports.a=12;需要一个一个定义很麻烦
*/
module.exports={a:12,b:5,c:99};
0%