利用寒假的15天的时间,完成了一个博客实战项目,巩固之前学习过的nodeJS。本次项目接触到一些新东西,一些代码目录的规范结构等,为了以后复习回顾,今天把这些知识记录下来。本次项目的源码在:github.com/zhaohe6/ith…
一、项目结构介绍
二、本次项目用到的第三方模块介绍
1.body-parser用于解析post请求的参数
const bodyParser = require('body-parser')
app.use(bodyParser.urlencoded({extended:false}))
2.express-session用于配置session,使用这个模块之后req对象中就会有session这个属性,然后就可以通过
req.session.username = 'itheima'
req.session.role = 'admin'
这样的方式来设置标志,如此一来登录的用户就会有username这个属性,没有登录的用户就没有username这个属性,这样就可以区分登录和未登录用户。
3.dateformat模块用于格式化日期
value.publishDate = dateFormat(value.publishDate,'yyyy-mm-dd')
4.md5-node用户密码加密模块
md5("123123")//返回加密之后的字符串
5.mongoose-sex-page用于mongodb数据库分页查询
pagination(Article)
.page(req.query.page).size(6).display(5)
.find()
.populate("author","username")
.exec((err, value)=>{
let str = JSON.stringify(value)
let articles = JSON.parse(str)
let val = articles.records
val.forEach((value)=>{
value.publishDate = dateFormat(value.publishDate,'yyyy-mm-dd')
})
res.render('admin/article',{
articles
})
})
6.mongoose提供操作mongodb数据库的CRUD等方法,返回的多是promise对象
7.nodemon模块在代码保存的时候自动重新启动服务
8.formidable用于处理文件上传的请求
const form = new formidable.IncomingForm()
//上传文件目录
form.uploadDir = path.join(__dirname,'../','../','public','uploads')
//是否保留后缀
form.keepExtensions = true
//解析表单
form.parse(req,(err,fields,files)=>{
Article.insertMany([{
title: fields.title,
author:fields.author,
publishDate:fields.publishDate,
cover:files.cover.path.split("public")[1],
content: fields.content
}]).then((value)=>{
res.redirect('/admin/article')
},(reason)=>{
console.log(reason)
})
})
9.joi模块用于编写校验规则
const schema = {
username: joi.string().min(2).max(12).required().error(new Error('用户名错误')),
password: joi.string().regex(/^[a-zA-Z0-9]{3,30}$/).required().error(new Error('密码格式不符合要求')),
email: joi.string().email().required().error(new Error('邮箱格式不符合要求')),
role: joi.string().valid('normal','admin').required().error(new Error('角色值非法')),
state: joi.number().valid(0,1).required().error(new Error('状态值非法'))
}
joi.validate(req.body,schema).then(...)
三、代码规范
1.连接mongodb数据库的文件可以在app.js中引入,连接数据库的文件内容一般是:
const config = require('config')
const mongoose = require('mongoose')
mongoose.connect(`mongodb://${config.get("db.user")}:${config.get('db.pwd')}@${config.get('db.host')}/${config.get('db.name')}`,{useNewUrlParser:true,useUnifiedTopology: true})
.then(()=>{
console.log('数据库连接成功')
})
.catch((reason)=>{
console.log('数据库连接失败',reason)
})
在app.js中引入:require('./model/connect')
四、ES6技术的应用
1.对象的解构赋值可以简洁的拿到一个对象中的多个属性
const {email,password} = req.body
2.当属性值和属性名相同的时候可以简写为属性名
五、mongodb命令
1.启动mongodb服务: mongod --dbpath /home/user1/mongodb/data --logpath /home/user1/mongodb/log/logs --fork
mongo服务启动必须要指定文件存放的目录dbpath,--fork以守护进程运行,如果带—fork参数则必须要指定—logpath即日志存放的位置(指定文件不是文件夹)
当然也可以加其他的参数,比如--auth,也是非常常用的,用来对数据库加权限。
2.net start mongodb 启动服务
net stop mongodb 终止服务
3.mongodb中的函数populate("属性名")用来关联两个集合