node.js使用express第三方库完成简单业务功能的代码实现

1.安装express第三方库

 npm install express --save

var express = require("express")        //引入文件,即可使用

var app = express();        //得到express,用来创建服务器

2.安装模板引擎(用于使用模板语法)

npm install art-template express-art-template --save

/*引入配置模板引擎*/
app.engine('html',require('express-art-template'));    //'html'和文件后缀名保持一致
/*设置模板默认查找的路径views,第一个参数‘views’,第二个参数是要改变的文件路径*/
app.set('views',path.join(__dirname,'./views'));

3.安装body-parser插件(用于获取表单post请求数据)

npm install body-parser --save

/*配置获取post请求数据的插件*/
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());

4.安装mongoose操作MongoDB数据库

npm install mongoose --save

var mongoose = require('mongoose'); //加载mongoose第三方包

/*连接数据库*/
/*第一个参数'mongodb://localhost:27017/user'中user是可变的*/
mongoose.connect('mongodb://localhost:27017/user',{useNewUrlParser: true});

/*得到数据库结构(Schema)*/
var Schema = mongoose.Schema;

/*设计数据库结构,约束*/
var userSchema = new Schema({
    email: {
        type: String,
        required: true
    },
    nickname: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    }
});


/*发布为模型并导出*/
module.exports = mongoose.model('User',userSchema);

5.安装密码加密插件

npm install blueimp-md5 --save

var md5 = require("blueimp-md5");
/*给请求过来的body中的密码进行加密*/   
request.body.password = md5(md5(body.password));//对密码进行二次加密

6.安装session管理保存一些敏感信息数据状态

npm install express-session

var session = require('express-session');        //加载session

/*配置session数据保存状态
*   添加session  request.session.属性名 = “值”
*   访问session  request.session.属性名
*   删除session  delete request.session.属性名
* */
app.use(session({
    secret: 'keyboard cat', /*配置加密字符串,会在原有的基础上和keyboard cat拼接起来去加密*/
    resave: false,
    saveUninitialized: true /*无论是否使用session,都默认分配一把钥匙*/
}));

app.js(入口文件)

var express = require('express');            //引入express
var path = require('path');        //引入path操作路径
var bodyParser = require('body-parser');    //引入body-parser操作表单post请求数据
var session = require('express-session');    //引入express-session保存敏感信息数据状态
var router = require('./router');            //引入路由接口文件
var app = express();        //得到express

/*开放静态资源*/
app.use('/public/',express.static(path.join(__dirname,'./public')));
app.use('/node_modules',express.static(path.join(__dirname,'./node_modules')));

/*引入配置模板引擎*/
app.engine('html',require('express-art-template'));
app.set('views',path.join(__dirname,'./views'));//更改文件路径默认找views文件目录下的文件

/*配置获取post请求数据的插件*/
app.use(bodyParser.urlencoded({extended:false}));
app.use(bodyParser.json());

/*配置session数据保存状态
*   添加session  request.session.属性名 = “值”
*   访问session  request.session.属性名
* */
app.use(session({
    secret: 'keyboard cat', /*配置加密字符串,会在原有的基础上和keyboard cat拼接起来去加密*/
    resave: false,
    saveUninitialized: true /*无论是否使用session,都默认分配一把钥匙*/
}));

/*加载路由*/
app.use(router);

/*访问页面404处理*/
app.use(function (request,response,next) {
    response.render('404.html')
});

/*统一错误处理(四个参数一个都不能少)*/
app.use(function (err,request,response,next) {
    response.status(500).json({
        err_code:500,
        message:err.message    /*将错误信息发送出去*/
    })
});

/*绑定端口号*/
app.listen('3000',function () {
    console.log('Server is running...')
});

router.js(路由文件)

/*路由设置*/

var express = require('express');
var User = require('./module/user');
var md5 = require('blueimp-md5');       //加载密码加密包

/*创建路由*/
var router = express.Router();

/*设置路由*/

/*渲染首页*/
router.get('/',function (request,response) {
    response.render('index.html',{
        user:request.session.user
    });
});
/*渲染注册页面*/
router.get('/register',function (request,response) {
    response.render('register.html')
});
/*处理注册请求*/
router.post('/register',function (request,response,next) {
    /*获取请求数据*/
    /*处理
     *   判断邮箱或昵称是否存在(存在则不进行注册)
     *   不存在 注册(新建用户信息),永久保存
     * */
    /*发送响应*/
    var body = request.body;
    /*查询:看一下注册的用户信息是否存在*/
    User.findOne({
        $or:[
            {email:body.email},
            {nickname:body.nickname}
        ]
    },function (err,result) {
        if(err){
            return next(err)
        }
        if (result){
            /*有数据说明用户存在则不让注册*/
            return response.status(200).json({
                err_code:1,
                message:'邮箱或昵称已存在'
            })
        }
        body.password = md5(md5(body.password));//对密码进行二次加密
        /*没有数据,则证明没有这个用户,则将这个数据用来创建用户*/
        new User(body).save(function (err,user) {
            if(err){
                return next(err)
            }
            /*注册成功,使用session保存登陆状态*/
            request.session.user = user;   //user是保存数据信息的对象
            response.status(200).json({         //创建用户成功
                err_code:0,
                message:'OK'
            })
        })
    })
});
/*渲染登录页面*/
router.get('/login',function (request,response) {
    response.render('login.html')
});
/*处理登录请求*/
router.post('/login',function (request,response,next) {
    var body = request.body;
    User.findOne({
        email:body.email,
        password:md5(md5(body.password))
    },function (err,user) {
        if(err){
            return next(err)
        }
        
        if(!user){      /*没有查询到,说明输入有误*/
            return response.status(200).json({
                err_code:1,
                message:'邮箱或密码输入错误'
            })
        }

        /*查询到,说明输入正确*/
        request.session.user = user;    /*通过session保存登陆状态*/
        response.status(200).json({
            err_code:0,
            message:'OK'
        })
    });
    /*获取表单数据*/
    /*查询数据库,匹配邮箱和密码是否正确*/
    /*发送响应*/
});
/*处理退出请求*/
router.get('/logout',function (request,response) {
    /*清除登陆保存状态*/
    delete request.session.user;
    /*重定向(跳转到登录页)*/
    response.redirect('/login')
});



/*导出路由*/
module.exports = router;

user.js(数据库文件)

/*用户数据库模型*/

var mongoose = require('mongoose'); //加载mongoose第三方包

/*连接数据库*/
mongoose.connect('mongodb://localhost:27017/user',{useNewUrlParser: true});

/*得到数据库结构(Schema)*/
var Schema = mongoose.Schema;

/*设计数据库结构,约束*/
var userSchema = new Schema({
    email: {
        type: String,
        required: true
    },
    nickname: {
        type: String,
        required: true
    },
    password: {
        type: String,
        required: true
    },
    created_time: {
        type: Date,
        // 注意:这里不要写 Date.now() 因为会即刻调用
        // 这里直接给了一个方法:Date.now
        // 当你去 new Model 的时候,如果你没有传递 create_time ,则 mongoose 就会调用 default 指定的Date.now 方法,使用其返回值作为默认值
        default: Date.now
    },
    last_modified_time: {
        type: Date,
        default: Date.now
    },
    avatar: {
        type: String,
        default: '/public/img/avatar-default.png'
    },
    bio: {
        type: String,
        default: ''
    },
    gender: {
        type: Number,
        enum: [-1, 0, 1],
        default: -1
    },
    birthday: {
        type: Date
    },
    status: {
        type: Number,
        // 0 没有权限限制
        // 1 不可以评论
        // 2 不可以登录
        enum: [0, 1, 2],
        default: 0
    }
});


/*发布为模型并导出*/
module.exports = mongoose.model('User',userSchema);

猜你喜欢

转载自blog.csdn.net/weixin_42661283/article/details/86669083