node从0到1,让你拥有自己的nodejs博客,持续更新(欢迎新手探讨,大神指点)
发布于 4 个月前 作者 kamendean 4448 次浏览 最后一次编辑是 3 个月前 来自 分享

node新人一枚,之前有过2年java经验、2年前端经验。2月前开始,在工作之余准备入node坑。 准备工作:大致的浏览了一下《深入浅出nodejs》以及一些基础理论帖子,感觉纸上得来终觉浅,绝知此事要躬行。顾遂决然舍去,准备着手做一个网站才踩坑。 本文宗旨:做到哪说道哪。 闲话少绪,开始! 源码:https://github.com/kamendean/mWar-master 示例demo:http://snewlate.com/admin (2017年8月1日更新) 账号admin 密码1 第一部分:架构 1,设计思路。 整个项目页面设想分为三部分:网站首页(在网上找了一份博客的页面),后台管理首页(同样找的模板),移动端首页(虽然bootstrap有适配,但是大多数的互联网公司都是做判断后写入自己设计的移动端页面) 做了这样一个判断 image.png 整个项目跳转全部用ajax局部刷新,不用iframe。这样就对jquery学习认知程度更高,不然绑定与冒泡等时而会引起项目的失灵。 2,框架搭建选择。 我对代码的思路一直都是“站在巨人的肩膀上”。也就是没有必要事必躬亲的从最底层开始写,因为毕竟我们的工作主要是应用。所以选择一个大众(插件多,问题答案多)的框架势在必行。 express 解决路由等问题 ejs 解决传值、页面重构问题。 好了,有了这两部分后已经可以着手做第一个事情了。 第二部分:流水账(持续写下去) 工欲善其事必先利其器:编辑器idea(习惯且好用),git bash 可以在windows下像linux一样执行命令行(比cmd好用,且为了在linux上搭建网站也要提前学),node和npm如果没安装。。。那你可能是走做了帖子 = =! 1,express 搭建。当你想到这个问题的时候说明你已经着手开始做了,第一思路去官网看给的文档(ps自学任何软件的第一利器),因为要搭建网站,所以“hello word”例子就可以跳过了。简单粗暴的express 安装http://www.expressjs.com.cn/starter/installing.html 安装说明(大神略过):这些安装命令既命令行式工作,以后linux一样,windows下可自行跳过已做部分 $ mkdir myapp //创建一个叫myapp的文件夹 $ cd myapp //进入myapp $ npm init //字面意思是初始化,其实就是生成一个package.json文件 entry point: (index.js) 弹出后一步一步输入后形成下图的内容 image.png 然后 $ npm install express --save //下载保存所有依赖 这样express基础搭建就已经完成了。简单 粗暴
使用。 此时我们来按照我们自己的意愿来修改文件的结构。按照我的设想如图:

image.png

routes //文件夹字面意思:路由,不理解这俩字的意思或者说理解的不深刻。因为生活中那个“路由器”影响太深,目前对他的理解就是:系统跳转 走向(有点路标的意思) image.png views //没啥好解释的。。。我自己起的名字,视图。意味着放html的地方 public //此目录下放置 css js img 插件 等静态文件 好了,做了这么多是该运行起来看一下了。运行方法推荐用idea自带的 如图: image.png 好处:自动进入工程目录 终止的时候Ctrl+c 输入y即可 ** 重点** appjs文件是整个express的控制中枢,想加入插件,标注路由等等 都要再这个文件里写入。

2,ejs 加入ejs 这是第一次尝试加入插件,既是对express加入插件的一个掌握也是对ejs使用的一个了解 第一步引入 image.png 第二步改写配置 image.png 本身的模板结尾是jade,习惯用html而且编辑器对html有个严格的验证。‘’ 此时已经可以用ejs模板了,来看看我们的首页被改写成了什么样子! image.png 此时已经把找到的两个模板融合进项目了,想查看的可以直接在git上下载代码(别忘了给个赞 = =!) 其余ejs的用法请自行百度或者别急,我后面会说到。

此时的项目在开始写应用之前还少最后一个重要环节:数据库

3,加入mysql 当然少不了先加入mysql模块 npm install mysql 我做了一下封装,如图 image.png 把配置文件与调用文件分离 当然在下面还有一个UUID的部分,自行查看源代码。 好了 加入了这么东西是费了这么多事,是该让他起到应有的作用了 应用: 设想先做网站首页(事实证明失败了,还是要先做后台管理) 设置路由: image.png 这是上面第一张图的部分截取,重定向到/index功能,在这需要解释俩功能点:1res.redirect/res.render 这俩都是控制结束后跳转,当然还有许多其他功能,这个可以直接查询express文档,目前常用的外加一个res.json的功能。2“/index”究竟代表着指向哪里或者说如何配置使用,我们用第一个功能来说明。 appjs是总控制器,需要在里面设置 image.png" “/”代表根目录 “index”是一个代号 代表上面设置的路径: image.png 根据引入的路径找到你配置路由的方法,打开引入文件 image.png 其中引入express和router路由是必须引入的 此外在这里做了一个串联,进行了一步数据库查询操作,为以后首页查询显示操作预留。查询数据库操作分为了三个文件 如图 image.png 另外提一句,不需要担心连接池的问题,在引入mysql时此部分开发者已经处理过了(巨人肩膀。。。)

好了,到此告一段落。下一步主要开发admin部分,以及数据库表的设计。 功能列表: 1登录 思路无非就是账号密码查询,提交的时候验证,返回值提示样式。这只是表面!!!! 第一个问题来了:登录是用ajax提交还是提交form表单。 解决:无论ajax和form提交都要做,当然登录是ajax提交,方便做验证样式以及提升用户体验。但是后期的时候做增加/修改的时候一定会用到表单提交,在这里不做ajax提交先,先尝试比较有难度的表单提交。虽然思路上我们可以自己做一个工具,但是有完美的解决方案插件:jquery.form。 image.png 第二个问题:session如何解决 解决:登录后保持用户的存在状态,解决办法是express有一个插件。在app.js中引入 image.png 然后对其做相应设置 image.png 对于这个插件,我目前只能做到应用的级别,具体其他参数及意义大家可以去他的官网查看一下。功能还是比较齐全的 第三个问题:密码加密与解密模块(还没做,大多数用MD5加密) 解决:并没有用@solarhell 童鞋提供的PBKDF2 或者 bcrypt 而是用了nodejs自带的加密模块crypto,下面有会讲到。 第四个问题:防止sql注入模块编写(还没做,可仿java做一个中间工具类或者直接用mysql给的方式去写)

第五个问题:验证码。看了许多帖子,nodejs貌似还没有一套完整轻量级的验证码插件,如果有请给我留言!~ 一起学习进步

2一套增删改查 目标是完成user表的一套增删改查以及基础部分代码的搭建 首先增加,ajax请求后回填content,这里涉及到回填后需要重新绑定按钮事件。 修改,思考过增加和修改用同一个页面。但是因为后期会因为逻辑业务问题导致页面不一样,所以放弃这个想法。第二点涉及到的事情:因为之前都是submit提交表单,所以后端post接收数据是req.body.xxx,修改的时候我用了get的请求方式,后端接收代码改为req.query.xxx。 删除,涉及到ajax请求后返回页面问题。 查看,利用插件弹出查看代码。

3分页 为什么分页要单独拿出来说? 因为涉及到了一个nodejs的与众不同的地方。异步 他的异步很彻底,当分页时会涉及到查询两次数据库,一次查询总条数一次查询数据。且会根据第一次查询结果对第二次有影响。而nodejs因为是异步,所以执行结果的callback会因为执行所需时间影响结果。利用插件async解决异步问题。(没来得及重构) image.png

-----华丽的分割线----- 解决一个BUG。犹豫项目整体前端架构是left菜单ajax请求局部刷新,当无session时返回login页面回填回content,影响体验。解决办法在login页面加入如下代码,解决思想是判断是否为加载页面,如果是则整体刷新。 image.png 在网站博客网站中“玩玩玩”模块有一个化学元素周期表的酷炫效果,个人十分羡慕做出来的大神。因为个人原因无法研究,喜欢的小伙伴可以先体验一下css的强大。 另感谢 @solarhell @bylevel 评论中童鞋提出的意见,感谢@fantasticsoul 支出的错误。提出的这些想法将在接下来的menu表中去学习与应用出来。

-----华丽的分割线----- 完成登出与加密功能; 加密功能如下: 引入nodejs的加密模块: image.png 使用调用方法: image.png需要注意的点如图三处:1、初始化createHash参数。2、utf8是防止你加密中文出现不相等。3、digest之后这个实例已经不可调用,所以每次调用的时候都createHash初始化一次。 另外需要注意:当你验证密码的时候,并不是解密这个密码是多少然后衡量是否相同。。。而是传过来的password加密一次和数据库对比。因为。。。md5不能反解!!!!这个是个坑,自己给自己挖的坑。 另有童鞋用的md5库,看起来确实方便,但是我没有尝试,仍然用的系统自带方法,考虑到初始化性能优先级问题。当然有想去用的可以尝试一下,然后给我留言!外部md5库地址:https://github.com/node-modules/utility 登出功能: 起初想登出嘛,很简单,销毁session就行了。事实上。。。。 image.png 并不是销毁,如果销毁了这个session,下次登入赋值的时候在内存中会不到,然后赋值后的req.session.user就变成的undefined,所以要么置空,要么设置状态。坑 另外此程序并没有添加热部署插件,有兴趣的同学可是尝试一下使用supervisor。我并不清楚这个插件会对linux线上环境产生怎样的影响 -----华丽的分割线----- 加入Q模块 实现promise异步控制。网上找了很多例子,发现都是详细讲解promise的原理,并没有Q模块实际应用。实际上Q模块的应用很简单,只要把第一步功能转化为Q模块形式就可以了。如图 image.png 圆圈为重点,方块为顺序。(http://blog.csdn.net/ii1245712564/article/details/51419533#promise 理论参考页) 尝试全局变量,写法如下: image.png 虽然很多人不建议采用全局变量,会有污染问题。但是所有东西都有两面性,就像歌曲好听但是睡觉的时候就是噪音,完全看控制。 目前采用的并不是全局变量,想要实现参数控制有两种方式: 1,如上图的全局设置。2,写一个配置文件,哪里用哪里引入。 代码GitHub已提交

27 回复

码字好累!一楼是我自己的

建议使用typescript

可以尝试 前后端分离(前端控制路由) 这样controller的逻辑会更加解耦清晰 比如 根据设备切换页面 给前端去做 3: PBKDF2 或者 bcrypt 4: 使用knex这样的SQL Builder 或者 用 ORM (typeorm或者sequelize) 5: 验证码可以用极验(第三方服务)或者 https://github.com/lemonce/svg-captcha 主要国内不能使用Google的reCAPTCHA

@zengming00 typescript + typeorm 谁用谁知道

@solarhell OK 大神 接下来一段时间内我会逐一试过然后继续更新实验结果的!

两年java + 两年前段 = 两年 or 四年?

@gfafei 2+2=4 完美@!

建议别用 async 这个库了,用 Promise 来解决异步吧。如果 node 的版本比较新还可以用 async/await,然后尝试一下 typescript 。

楼主,我觉得,你的项目目录结构还是……有点古老了…… 就这一两天我上一个我们一直在用的吧……

而且……indexServer叫indexService才对吧,你是不是写错了,最后,按照社区的约定,模块的命名都restify,写成index-service

支持楼主,楼主加油~

支持楼主,楼主加油~

@bylevel 最近较忙,之前研究了异步问题发现确实async有点古老且不如promise来的通用一些。正在研习promise,准备能玩得转后再回来解决异步问题。感谢提醒!

@fantasticsoul 其实对于结构问题我是沿用的java后台逻辑层的结构。对于这个结构可能确实古老,但是并不影响直观阅读性。 另对于命名个人倾向于没有符号。indexServer部分应该是没注意拼写错误的原因,现改正。多谢提出问题

安利自己的express优化组件 Ting.js
https://github.com/294678380/Ting.js 丢掉麻烦的router.get

已更新promise的实现Q模块。尝试应用全局变量

@dmwin72015 请不要在这刷数据 谢谢

顶一个 自豪地采用 CNodeJS ionic

回到顶部