node.js初步:登录注册服务器端实现(无数据库模拟版)

2009年,node.js横空出世。v8引擎的高效渲染和基于JS异步的性能,让其“一夜之间”火爆全球。

最近刚结束了一个项目,再加上一直以来对后端有些许兴趣,于是把目光瞄向了node.js这门基于JS的后端语言!
这篇文章根据登录注册这个小demo来认识一下node,也算熟悉一下后端开发。

模块

node.js中最强的莫过于“模块化”了。各式各样的模块,诸如:http、https、fs…层出不穷,而且直接调用,简单便捷。

引入方式:

const 变量名 = require('模块名');

比如,本demo所用到的:

const http=require('http')
const url=require('url')
const querystring=require('querystring')   //“解析数据” 模块
const fs=require('fs')

其中fs算是node中比较重要的模块了,只要涉及文件读取,都要用到它。。。

开始

首先,因为没搞数据库,我们用一个对象来模拟一下:

let user={
	admin:123456
}

(此代码作用:规定必须是这种格式的存取)

然后,我们需要和浏览器交互——交互即需发请求——请求在node中需用到http/https
即我们需要写一个服务器程序 -> http.createServer(function(response,request){}).listen(端口号)
这个函数内置一个回调函数,其接收两个参数:请求(request)和响应(response)、最后还有一个listen监听函数,负责告诉服务器“目标是谁”;

在其中,需要判断请求方式——因为不能说登录注册两种方式就放两个服务器上是吧(你也得看人家服务器愿不愿意啊)

	//获取数据
	let path,get,post
	if(req.method=='GET'){
		//es6语法:解构
		let {pathname,query}=url.parse(req.url,true)   //parse ——url块 的方法——解析链接(req.url,和是否解析query部分(true))
		path=pathname
		get=query
		complete()
	}else if(req.method=='POST'){
		let arr=[]
		path=req.url   //因为post传参不在url展示,故其url要简便很多,直接取出即可
		//data 事件——post请求 请求数据(buffer指代二进制数据流)
		req.on('data',buffer=>{
			arr.push(buffer)
		})
		//end事件——数据处理结束后的回调函数
		req.on('end',()=>{
			//Buffer.concat——依托于Buffer对象中的concat方法,将arr数组数据“拼接”起来(也可以理解为:摆脱数组形态)
			//toString()——任何数据都可以字符串化
			//querystring——字符串解析->JSON格式
			post=querystring.parse(Buffer.concat(arr).toString())
			complete()
		})
	}

好了,get和post里都获取到数据了,接下来要对数据进行处理了,因为处理步骤是相同的,我们就把其放在一个函数(complete)中,再分别在get和post里调用(第7、20行)。

等等,我们说下 buffer ——二进制数据流
为什么要对其进行 Buffer.concat 操作? 我们来看一段代码:

let http=require('http')
http.createServer((req,res)=>{
	let result=[]
	req.on('data',buffer=>{
		result.push(buffer)
	})
	req.on('end',()=>{
		console.log(result)
	})
}).listen(8888)

在这里插入图片描述
它的结果是个名为Buffer的数组
而加上Buffer.concat以后,就变成了字符串形式:
在这里插入图片描述
然后我们就可以对其 querystring转换为对象格式 ,然后取出数据了

API

写过文档(或者看过后端写文档)的都知道,写后端比较重要的就是写一个API调用文档——告诉前端,你需要往哪里发请求,需要传什么,接收什么,字段有哪些,以什么方式。
这里,我们规定——err为1,代表有错;反之,代表通过。提示信息写在msg中,通过end函数返回给页面:

function complete(){
		if(path=='/login'){
			res.writeHead(200,{
				"Content-Type":"text/plain;charset=utf-8"
			})
			let {username,password}=get
			if(!user[username]){
				//end :只能用字符串(这里必须用stringify转一下)
				res.end(JSON.stringify({
					err:1,
					msg:"用户名不存在"
				}))
			}else if(user[username]!=password){
				res.end(JSON.stringify({
					err:1,
					msg:"密码错误"
				}))
			}else{
				res.end(JSON.stringify({
					err:0,
					msg:"登录成功"
				}))
			}
		}else if(path=='/reg'){
			res.writeHead(200,{
				"Content-Type":"text/plain;charset=utf-8"
			})
			let {username,password}=post   //把“新增的”数据取出
			if(user[username]){            // ↑ 放到user中
				res.end(JSON.stringify({
					err:1,
					msg:"账户已存在"
				}))
			}else{
				user[username]=password
				res.end(JSON.stringify({
					err:0,
					msg:"注册成功"
				}))
			}
		}else{
			//如果既不是登录也不是注册——刚打开页面的时候!(这一步至关重要:判断页面路径是否正确)
			fs.readFile(`www${path}`,(err,data)=>{
				if(err){
					res.end('404')
				}else{
					res.end(data)
				}
			})
		}
	}

我们来分析一下:

res.writeHead(200,{
	"Content-Type":"text/plain;charset=utf-8"
})

代码中这一部分和java写后端中的:

response.setHeader("Content-type", "text/html;charset=UTF-8");
response.setCharacterEncoding("UTF-8");

是一样的效果——规范字体格式

还有一点要注意的是:end函数——只接受字符串形式,故常用JSON.stringify()来转换。

下面把HTML代码放上:
(关于这个jQuery包的下载,很好玩:在命令行里输入npm i jquery,回车,即可(前提是你得下载了node))

<!DOCTYPE html>
<html lang="en">
	<head>
		<meta charset="UTF-8">
		<title>这是试验</title>
		<script src="jquery.min.js"></script>
	</head>
	<body>
		用户名:<input type="text" id="username">
		密码:<input type="text" id="password">
		<button id="login">登录</button>
		<button id="reg">注册</button>
		
		<script>
			$('#login').click(function(){
				$.ajax({
					url:'/login',
					data:{
						username:$('#username').val(),
						password:$('#password').val()
					},
					dataType:'json',
					success(res){
						if(res.err){
							alert(res.msg)
						}else{
							alert("登录成功")
							location.href="admin.html"
						}
					}
				})
			});
			$('#reg').click(function(){
				$.ajax({
					url:'/reg',
					method:'post',
					data:{
						username:$('#username').val(),
						password:$('#password').val()
					},
					dataType:'json',
					success(res){
						if(res.err){
							alert(res.msg)
						}else{
							alert("注册成功")
						}
					}
				})
			});
		</script>
	</body>
</html>

做完这一切,在命令行输入:node js文件完整路径,然后打开浏览器,输入:localhost:监听的端口号/html文件名,即可测试

  • 18
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

恪愚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值