《Node.js开发指南》
学习nodejs有一段时间了,基本的概念已经有了大概的了解。《Node.js开发指南》进行到第五章-使用Nodejs进行web开发,实现一个微博系统。
前面看书一直断断续续,前段时间只能晚上在宿舍看一会,没有系统性,虽然勉强看完了前面四章节的基础知识,但还不能说会了。希望通过这个小系统的练习,对nodejs有更深入的理解。
微博系统主要功能
1.路由控制
2.页面模板
3.数据库访问
4.用户注册
5.登陆
6.用户会话
主要技术点:
1.Express框架
2.MVC设计模式
3.ejs模板引擎
4.MongoDB数据库
准备工作
简记 | 全拼 | 中文 | 含义 |
---|---|---|---|
M | Model | 模型 | 对象及数据结构的实现,通常包括数据库操作 |
V | View | 视图 | 表示用户界面,HTML组织结构 |
C | Controller | 控制器 | 用于处理用户请求和数据流、复杂模型,将输出传递给视图 |
nodejs两大特性,其一:
可以跳过
http
服务器,因为它本身就是。提供http模块,由c++实现,性能可靠,可直接应用到生产环境。
其二:
与其他语言的显著区别,原始封装成都较低。nodejs中很多工作需要自己完成(但不是都是自己动手,可借助于第三方框架)。
使用http模块
减少一层抽象,性能的提升同时提高了开发难度。就一个简单的post请求来说,PHP只要两行代码,而nodejs需要自己手动写post请求过程。底层接口尽管用起来复杂,但让我们对http协议的理解更加清晰。
http模块是http服务器内核的封装,可以做网站,可以做代理服务器。手动实现所有东西,小到POST请求,达到Cookie、会话管理。当你用这种方式建立网站时,几乎已经做好了一个完整的框架了。
Express框架
更高层的http接口,以及许多网站常用功能实现了。
但不是一个无所不包的全能框架,没有像Rails或Django实现模板引擎甚至ORM(Object Relation Model,对象关系模型)。只是一个轻量级的web框架,多数功能只是对http协议中的常用操作的封装,更多的功能需要插件或者整合其他模块来完成。
快速开始
安装Express
目前express已经更新到4.x版本,安装时可用@加版本
1 | npm install -g express-generator@3 |
书上用的是2.5.8版本,所以
1 | npm install -g express@2.5.8 --save |
不加版本号,默认最新版本.安装完成后,用express -V
检查安装结果。
这样就可以使用express命令了。
最快的安装启动express框架简要步骤:
1 | express blog && cd blog && npm install && npm start |
express 4.x
无法用node app.js
启动,指令为npm start
。
然后打开localhost:3000即可见到熟悉的Welcome to Express
。
对应的版本都需要对应的依赖,有时候安装的时候会自动选择最先版本,也需要最新的依赖;制定的方法是在
package.json
中制定依赖的版本,再运行npm install
来安装依赖。
最重要的事应该是理解框架的设计思想,文件之间的映射关系,各个文件夹的分工。
理解MVC。
老版本用supervisor app.js
来启动应用,依然可行。
建立微博网站
1功能分析
开发中的大忌是没想清楚要做什么就开始动手。先应该有一个全局的规划。
- 以用户为中心,需有注册登录功能
- 最核心的是信息的发表,涉及数据库访问,前端显示
- 评论,转发,点赞等功能,但由于学习目的,不一一实现
2路由规划
或者控制器规划是网站的骨架部分,优先考虑
根据功能设计,路由规划方案如下:
- /: 首页
- /u[user] 用户主页
- /post: 发表信息
- /reg: 用户注册
- /login: 用户登录
- /logout: 登出
常见错误处理
在完成用户注册页面书写之后,运行出错。
error:connection strategy not found
1 | $ node app.js |
问题解决
在cnode(已用github邮箱注册)上看到了一篇同样的问题,答案中解决了。
解决方式
1 | npm install connect-mongo@0.8.2 --save |
独立的模块更新可能影响整体功能。在同一个时期要用当时的版本。
定义的db.js
中DEFAULT_PORT
没有定义
1 | TypeError: Cannot read property 'DEFAULT_PORT' of undefined |
问题解决
1 | DEFAULT_PORT ----- 27017 |
到今天下午,基本完成第五章的学习。程序能够正常运行,但是还有许多细节不是很清楚,例如mongodb
的使用,之间的映射关系自己也还要梳理一遍。
《Node.js实战》
图书编号:TP312JA425
第一部分 基础篇
nodejs及JavaScript基础了解。
第二部分 提高篇
相册服务器
模块
模板
2015/12/30 noon 17:09 library
稍后补上笔记并上传代码备份
第三部分 实战篇
###第七章使用express构建web应用
路由
1 | app.get('/', function(req, res){ }); |
URL路由函数一般格式
1 | app.method(url_pattern, optional_functions, request_handler_function); |
method: get, post, delete, put; all
简单的URL
/path/to/resources
也支持正则
/user(s)?/list
/user/*
占位符(用:
标记)从请求路由中提取指定值(除了/
),解析路由时将匹配到的占位符值保存到req.params
对象中
1 | app.get("/albums/:album_name.json", function(req, res){ |
如上面请求/albums/linking.json,输出结果为:
request linking
模块化,REST
风格的接口。
将能够独立出来,以后会复用的模块分离成单独文件。
模块化增加了源代码可读性,结构更加清晰明了。
中间件
如
express
就建立在connect
这个中间件。
通过一下格式引用中间件
1 | var middle_something = require('middle_something'); |
配置
使用
configure
方法指定配置名称,在特定的配置环境下该方法提供的函数会被调用。未指定名称,则函数会被所有的配置环境调用,多个配置名称可以用逗号隔开。
1 | app.configure(function(){ //全部适用 |
Mac和UNIX电脑中shell命令
1 | NODE_ENV=production node program.js |
Windows命令
1 | set NODE_ENV=production |
中间件执行过程中有一个顺序问题,注意re
s.end`的位置,它会关闭响应。
静态文件处理
express
通过connect
提供了static
中间件,将存放静态文件的根目录路径名赋给中间件创建函数即可
1 | app.use(express.static("/secure/static_site_files")); |
bodyParser
,cookieParser
,session
1 | var app = express() |
编写应用过程中,检测和捕捉错误的代码量往往要大于正常操作的代码量,这才是良好的代码风格。
也许我单纯的以为代码只要能实现直接的功能就行了,是太浅薄的理解。程序中大部分时间都在跟
bug
作斗争,良好的代码风格能够节省大量的时间,快速定位错误所在。
第四部分 进阶篇
- 本文作者: Linking
- 本文链接: https://linking.fun/2016/01/05/nodejs学习记录/
- 版权声明: 版权所有,转载请注明出处!