阅读 217

NodeJS实战总结

利用寒假的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("属性名")用来关联两个集合

文章分类
前端
文章标签