用的都是我熟悉的技术,看了别人的开发过程,自己也学到了一些新的知识
生成配置文件
开发结束后,可以使用bower init
来生成前端的配置文件。
不过在bower install *时已经生成了。
可以使用 npm init
来生成后端的配置文件
不过使用
express -e *
时,也会生成package.json。npm install * --save才会保存到package.json,开发结束后,把package.json删了,重新生成一次。
删除
可以使用type: delete
;
之前也知道,但还一直使用$.get来做。
表单提交
body-parser, extend=true;
form name=movie[title];
可以直接取出req.body.movie;
views
修改app.js,把router指向的view目录改为views/pages
在views中新建includes和pages
mongoose schema
//保存之前的操作
// next()的位置要注意,否则会先save,再pre。
MoiveSchema.pre('save', funciton(){});
// 把一系列的方法抽象出来,model
MovieSchema.statics = {}
// document
UserSchema.methods = {}
日期格式化
npm install moment
在app.js中,app.locals.moment = require('moment');
早list.ejs中,<td><%= moment(movie.meta.updateAt).format('MM/DD/YYYY') %></td>
if()判断
false 0 undefined null NaN '' => false
true 1 {} [] '0' => true
属性复制
//复制**source**对象中的所有属性覆盖到**destination**对象上,并且返回 **destination** 对象. 复制是按顺序的, 所以后面的对象属性会把前面的对象属性覆盖掉(如果有重复).
_movie = _.extend(movie, movie_obj);
grunt集成自动重启
之前只在前端用过,现在后端也可以用。
npm install grunt -g
npm install grunt-cli -g
npm install grunt-contrib-watch --save-dev
npm install grunt-nodemon --save-dev
npm install grunt-concurrent--save-dev
password
用bcrypt
比较好一些
获取参数
- :id => params.id
- id=12 => query.id get
- {id: 12} => body.id post
函数结束
// 下面的语句还会执行
res.redirect('/');
// 下面的语句不执行
return res.redirect('/');
// 下面的语句不执行
res.redirect('/');
return false;
app调用router新方式
为了能在router中给app.locals添加本地变量,好在views中使用
也可以使用res.locas,但app好一点
以index.js为例
删掉require('index.js'); app.use('/', router);
添加require('./routes/index')(app);
要放在session后面
index.js
中通过module.exports = function(app){}
抛出。
权限控制
学到很多
role使用number类型来规划
用中间件来验证signinRequired(), adminRequired(),效率确实挺高的。
运行环境
根据不同的运行环境,配置相应的信息。现在配置了dev
根据不同的express版本,使用不同的方式配置信息,现在是4.x
评论的存储 查询 呈现
schema
通过objectId联系
查询,通过回调函数,populate方法
呈现,通过面板和媒体对象组件
用户之间的相互回复
创建input:$('<input>')
$('input')
: 选择input
new 对象
_movie = new Movie(movie_obj);
如果Movie没有a属性,movie_obj有a属性,结果_movie还是没有a属性
中间件
才会有next这个参数