一、什么是Node.Js
node.js是服务器语言,后台语言,使用的是ECMScript的语法
特点:
- 对于前端非常友好,学习成本低
- node的服务器比PHP的服务器更快,速度提升了86倍
- 单线程异步执行,事件处理机制
- node.js的源码是由c语言构成,采取了ECMAScript的语法进行编程,运行在V8引擎中
二、Node.Js的安装
-
官网下载安装(入门推荐):
(https://nodejs.org/zh-cn/download/)
-
安装完node的标志是在命令提示符中输入
node -v可以查看当前node的版本号
npm -v可以查 看当前npm的版本号 -
包管理工具安装:
nrm是一种资源包的来源管理工具,主要用来修改npm包的来源方,使用之前先安装,方式为:npm install nrm -g,参考地址:
https://www.jianshu.com/p/e18c4c30b2c5
三、Node.Js的内置模块
- http模块:用来开启服务
//1.引入模块
const http = require("http”);
//2.开启一个http服务,接收的回调函数中,有两个返回值,req表示请求(客户端到服务端),res表示响应(服务端到客户端)
const httpObj = http.createServer((req,res)=>{…})
//创建服务成功后,每次请求都会触发createServer的回调函数
const httpObj = http.createServer((req,res)=>{
//http请求默认情况下,会多请求一次favicon.ico图标文件,如不需要可以过滤
if(req.url != "/favicon.ico"){
//可以在服务端打印信息,只要被访问就会触发
console.log("有人访问了");
//参数req有属性为url,表示当前服务被哪个url访问,打印访问服务的url
console.log("访问的地址是:" + req.url);
//如果需要向前端返回数据,而且数据需要以html的形式被解析,有两种方式:
// 1.通过head和meta标签设置字符编码
//res.write("<head><meta charset='utf-8'></head>");
// 2.通过设置请求头,设置字符编码(推荐)
res.writeHead(200,{"content-type":"text/html;charset=utf-8"})
//通过参数res的write方法,向前端返回数据,此处打印标签进行测试
res.write("<mark>晚上吃什么</mark>")
//完成此次请求的响应之后,要结束本次响应,否则前端会一直处在请求状态
res.end()
}
})
//3.监听端口地址,成功开启服务,执行回调函数...
httpObj.listen("8001","127.0.0.1",()=>{
console.log("server runing...");
});
- fs模块:用来操作模块
//引入fs(文件系统)模块
const fs = require('fs’);
//调用fs模块的读取文件方法,接收三个参数:
//参数1:指定读取文件名为请求的文件名
//参数2:指定解析文件内容的编码格式,可省略
//参数3:回调函数,读取文件后执行,接收两个参数
//参数1:错误日志,或,null
//参数2:文件内容
fs.readFile( "./www/index.html","utf-8",(err,fsCont)=>{
if (err){
//如果不为null,表示有错误内容,响应404
res.write( "404")
} else{
//如果为null,表示找到文件,将文件作为数据响应
res.write( fsCont)
}
res.end(); //结束本次请求
})
- url模块:用来解析url
const urlModel = require("url")
//模拟一个url
var url = "http://www.baidu.com/data/hahaha/?a=1&b=2#01";
console.log( typeof url);
console.log(url);
//将url解析成对象
var obj = urlModel.parse(url);
var obj = urlModel.parse(url,true); //将url中的query属性解析成对象
console.log( typeof obj);
console.log(obj);
//将对象解析成url
var str = urlModel.format(obj)
console.log( typeof str);
console.log(str);
- querystring模块:用来解析url携带的数据
//将查询字符与对象互相转换的模块
const querystring = require("querystring");
//模拟类似于get方式发送的信息
var str = 'name=admin%padd=123';
//根据%号,分割字符为对象
var obj = querystring.parse(str,"%");
console.log( typeof obj);
console.log(obj);
//模拟对象
var obj2 = {a:1,b:2}
console.log(obj2)
//将对象转换成类似于get方式发送的信息,用%号隔开
var str2 = querystring.stringify(obj2,"%");
console.log( typeof str2)
console.log(str2)
四、Node.Js搭建一个登陆注册服务器
const http = require("http");
const fs = require("fs");
const url = require("url");
const qs = require("querystring");
http.createServer((req, res)=>{
if(req.url !== "/favicon.ico"){
if(url.parse(req.url).pathname === "/api"){
ajaxHandle(req, res);
}else{
fileHandle(req, res);
}
}
}).listen("3000");
function ajaxHandle(req, res){
// 地址上的数据,直接解析,同步
const urlObj = url.parse(req.url, true);
// 非地址上的数据,通过事件接收,异步
let str = "";
req.on("data",d=>{
str += d;
})
req.on("end",()=>{
let reqObj = null;
if(str === ""){
reqObj = urlObj.query;
}else{
reqObj = qs.parse(str);
}
if(reqObj.type === "login"){
// 登录功能
login(reqObj, res)
}else{
// 注册功能
register(reqObj, res)
}
})
}
let userMsg = [];
function register(data, res){
// 利用some方法判断用户数据中是否已经存在当前注册的用户名
let onoff = userMsg.some(val=>{
return val.user === data.un
})
if(onoff){
// 如果存在,用户名重复
res.write(JSON.stringify({code:0,title:"用户名重复"}))
}else{
userMsg.push({
userid:"userid_"+Math.random().toString().slice(2),
user:data.un,
pass:data.pw,
flag:0
})
// 不存在,注册成功
res.write(JSON.stringify({code:1,title:"注册成功"}))
}
console.log(userMsg);
res.end();
}
function login(data, res){
// 此案判断用户数据中是否具有传入的用户名
console.log(data);
let i = 0;
let onoff = userMsg.some((val, idx)=>{
i = idx;
return val.user === data.un;
})
if(onoff){
// 如果有,判断当前数据是否和传入的密码相等
if(userMsg[i].pass === data.pw){
// 相等,登录成功
res.write(JSON.stringify({code:1,title:"登录成功",data:userMsg[i]}))
// 修改当前数据的状态
userMsg[i].flag = 1;
}else{
// 不相等,密码错误
res.write(JSON.stringify({code:2,title:"密码错误"}))
}
}else{
// 没有用户名,未注册
res.write(JSON.stringify({code:0,title:"用户名不存在"}))
}
res.end();
}
function fileHandle(req, res){
fs.readFile("./www" + url.parse(req.url).pathname,(err, data)=>{
if(err){
res.write("404");
}else{
res.write(data);
}
res.end();
})
}