Node.js 第6天课堂笔记
知识点
- 多人社区案例
反馈
复习
- MongoDB 数据库
- 灵活
- 不用设计数据表
- 业务的改动不需要关心数据表结构
- DBA 架构师 级别的工程师都需要掌握这项技能
- 设计
- 维护
- 分布式计算
- mongoose
- mongodb 官方包也可以操作 MongoDB 数据库
- 第三方包:WordPress 项目开发团队
- 设计 Schema
- 发布 Model(得到模型构造函数)
- 查询
- 增加
- 修改
- 删除
- Promise
- http://es6.ruanyifeng.com/#docs/promise
- callback hell 回调地狱
- 回调函数中套了回调函数
- Promise(EcmaScript 6 中新增了一个语法 API)
- 容器
- 异步任务(pending)
- resolve
- reject
- then 方法获取容器的结果(成功的,失败的)
- then 方法支持链式调用
- 可以在 then 方法中返回一个 promise 对象,然后在后面的 then 方法中获取上一个 then 返回的 promise 对象的状态结果
7.path路径操作模块
path.basename('c:a/b/c/index.js')=====>index.js获取文件名,默认包含扩展名
path.basename('c:/a/b/c/index.js','.js')=====>index 去掉扩展名
path.dirname('c:/a/b/c/index.js')======>'c:/a/b/c' 获取目录
path.extname('c:/a/b/c/index.js')======>'.js' 获取扩展名
path.isAbsolute('c:/a/b/c/index.js')======>true 判断是否绝对路径
path.parse('c:/a/b/c/index.js')======>{
root: 'c:/',
dir: 'c:/a/b/c',
base: 'index.js',
ext: '.js',
name: 'index'
}
path.join('c:/a','b')=========> 'c:\\a\\b 拼接路径,可以有多个
8.Node中的其他非模块成员
在每个模块中,除了require
exports
等模块相关API外,还有两个特殊成员:
__dirname
用来动态获取当前文件模块所属目录的绝对路径__filename
用来动态获取当前文件的绝对路径
在文件操作中,使用相对路径不可靠,因为在node中文件操作的路径被设计为相对于执行node命令所处的路径。
解决办法:
只需要把相对路径编程绝对路径即可。这里使用__dirnane
或者__filename
帮我们解决
为了避免手动拼接目录带来错误,推荐多使用path.join()
来辅助拼接。
9.多人社区项目开始
1.目录结构
1 .
2 |-app.js 项目的入口文件
3 |-controllers
4 |-models 存储使用mongoose设计的数据模型
5 |-node_modules 第三方包
6 |-package.json 包描述文件
7 |-package-lock-json 第三方包版本锁定文件(npm5以后才有)
8 |-public 公共静态资源
9 |-README.MD 项目说明文件
10 |-routers 如果项目复杂,代码量大,最好把所有的路由按照业务的分类存储到routers目录中
11 |-router.js 简单一点,把所有的路由都放到这个文件
12 |-views 存储视图目录
2.模板页
- art-template子模板
- art-template模板继承
3.路由设计
路径 | 方法 | get参数 | post参数 | 是否需要登录权限 | 备注 |
---|---|---|---|---|---|
/ | GET | 渲染首页 | |||
/register | GET | 渲染注册页面 | |||
/register | POST | email、nickname、password | 处理注册请求 | ||
/login | GET | 渲染登录页面 | |||
/login | POST | email、password | 处理登录请求 | ||
/logout | GET | 处理用户退出请求 |
4.模型设计
5.功能实现
6.书写步骤
- 创建目录结构
- 整合静态页-模板页
- include
- block
- extend
- 设计用户登录、退出、注册的路由
- 用户注册
- 先处理好客户端页面内容(表单控件name、收集表单数据、发送请求)
- 服务端
- 获取客户端表单请求数据
- 操作数据库
- 如果有错,发送500状态码
- 其他根据业务发送不同的状态码
- 用户登录
- 用户退出
- 服务端重定向针对异步请求无效
window.location.href = '/'
下午总结
- path 模块
- __dirname 和 __filename
- 动态的 获取当前文件或者文件所处目录的绝对路径
- 用来解决文件操作路劲的相对路径问题
- 因为在文件操作中,相对路径相对于执行
node
命令所处的目录 - 所以为了尽量避免这个问题,都建议文件操作的相对路劲都转为:动态的绝对路径
- 方式:
path.join(__dirname, '文件名')
- art-template 模板引擎(include、block、extend)
- include
- extend
- block
- 表单同步提交和异步提交区别
- 以前没有 ajax 都是这么干的,甚至有些直接就是渲染了提示信息出来了
- 异步提交页面不会刷新,交互方式更灵活
- Express 中配置使用 express-session 插件
- 概述案例中注册-登陆-退出的前后端交互实现流程
Node.js 第7天课堂笔记
Express
1.中间件
[]: http://expressjs.com/en/guide/using-middleweare.html
中间件的本质就是一个请求处理方法,我们把用户从请求到响应的整个过程分发到多个中间件中去处理,这样做的目的是提高代码的灵活性,动态可扩展的。
- 同一个请求经过的中间件都是同一个请求对象和响应对象
1.1 应用程序级别中间件
万能匹配(不关心任何请求路径和请求方法)
app.use(function(req, res, next){
console.log('Time',Date.now())
next()
})//调用了next()则继续向下执行,找到匹配的第一个中间件
//如果没有调用next()则停止,停留在当前中间件
只要是以’/xxxx’开头的请求
app.use('/a', function (req, res,next){
console.log('Time:',Date.now())
next()
})
1.2 路由级别中间件
get:
app.get('/',function(req,res,next){
res.send('hello world')
})
post:
app.post('/',function(req,res,next){
res.send('Got a post request')
})
put:
app.put('/',function(req,res,next){
res.send('Got a put request')
})
delet:
app.delet('/',function(req,res,next){
res.send('Got a delet request')
})
1.3 错误处理中间件
app.use(function(err,req,res,next){
console.error(err.stack)
res.status(500).send('Something broke!')
})
1.4 内置中间件
- express.static
- express.json
- express.urlencoded
1.5 第三方中间件
[]: http://expressjs.com/en/resources/middleweare.html
- body-parser
- compression
- cookie-parser
- morgan
- response-time
- serve-static
- session