nodejs+mysql实现用户注册登录

首先给出源码下载地址:https://download.csdn.net/download/sky1679/11064281

之前用django框架写过模块化的基于python+sqlite(自带的数据库)后端。那时候就是在不同的文件里写不同的东西(为了模块化),当时也不知道为什么要这么写,以至于刚开始用node.js写不会写了,django输入某个命令记得好像是manage.py啥的可以开启服务器。而我node.js的服务器在哪呢?

这次写的依旧是传统后端渲染,但是我一开始不懂,居然写了一个html文件加js写的后端响应就以为写完了。点开html文件,并没有什么用,只是一个静态页面,没有和nodejs关联。这时候我才想起,之前都是要先启动服务器的。即运行view.js文件(nodejs中的http模块就是用来创建服务器的)。这个login.html要想关联上来,那就必须是在response中返回。当然了response肯定是不支持html文件的,所以可以先引入fs模块,把login.html读出来。

链接mysql数据库,在菜鸟教程的nodejs一章已经写的很详细了,照抄就是了。然后会碰到一个问题,就是如何列表渲染table的tr组件,毕竟数据库里的行是会变的,那就需要一个模板引擎了,还是那句话,django都把这些东西集成了,以至于你会以为本来就该是这样,但是事实上你得自己引入模板引擎。这里我用的是ejs,语法去官网上看看就行,其实就只要学两条,一条是js的逻辑,如for循环,用<% %>,另一条是变量,用<%= %>,其他的用处不大,可学可不学。

注意异步函数的问题,这里回调函数基本上第一个参数都是err,也就是错误信息,最好处理一下if(err),不然待会一报错就会自动退出服务器,这真的很烦。另外一点就是因为是异步,所以可能会先执行底下的函数,如果还想这一部分按顺序运行,把底下的函数也放到回调里面。

res.end()是必须写的,标志着响应报文的结束,如果body内容少的话,把要返回的响应报文主体全放在res.end(),不写res.write()也不是不行。

关于分页部分,网上是有部分代码的,但是我嫌他太冗杂了,还是自己写。固然后端一次返回一页写起来比较简单,但是每次点下一页就要刷新,麻烦。所以这部分我选择了css的样式display:none直接隐藏掉。为了让他一打开页面就执行我在 < script >中修改display的操作,我试图把js从body中提到head中,于是出现了一个问题,就是body里的html的dom树还未建立,写在head里的getElementById根本找不到对应节点。后来被迫放回body尾部,没想到并不会出现显示全部行然后才隐藏的尴尬情况。

在修改display的时候我是选择一页显示五个,但是可能最后一页不到五个,所以得自己做一下条件判断。不然会出现getElementById但是取不到Id的情况,这部分节点因为get不到,会变成null,你不能操作一个null的display,会报错。

后来又发现按了下一页之后能显示,但是td之间挤得很紧,发现问题,我之前恢复tr的display用的是block,其实要写成table-row。这一点是我学艺不精了,我自以为display就四种样式,none,block,inline,inline-block。

要求在数据库中的密码为非明文。所以就涉及到加密问题,这里我直接用了nodejs自带的某个函数,其中的md5加密。实现为,注册的时候把密码存到数据库之前先加密一次,然后要登录的时候再把密码加密一次再和数据库里的比对。这里还有一个坑,就是connection.query()的result,即使没找到任何数据库中对应的行,他也会返回空数组。所以直接用if(result)是不行的,我估摸着应该是空数组对应的布尔值也是true,于是改变成if(result.length === 0)。

还剩最后一个问题,就是得支持sql语句直接查询,有一点要说的是?后面的内容query都是会编码的,这涉及到url的编码,个人是直接先对url进行编码,这里js提供了一个encodeURIcomponent()函数进行部分编码,然后打算在后端解码。这里发现url.parse()自动就帮我解码了。console.log输出了一下,的确是这样。

基本上所有的坑我都列出来了,css样式我一点没写,毕竟这也不是什么关键的东西,各凭爱好加上去吧。

猜你喜欢

转载自blog.csdn.net/sky1679/article/details/88839569