path 模块
- app.use(’/public/’,express.static(path.join(__dirname,’./public/’)))
如果一整个网站移动,则它的绝对路径更改,配置文件的路径是静态的就会出现bug
- path.ioin(__dirname) 是动态获取文件的绝对路径,join方法用来职能拼接字符串
配置模板引擎
- npm i atr-template express-atr-template
//1. app.engine('html',require('express-art-template')) //2.默认到views目录下查找index 默认路径 app.set('views',path.join(__dirname,'./views/'))
app.get('/',function(req,res){
// res.send('hello')
//3. render 默认去找views
res.render('index.html',{
name : '张三'
})
})
默认模板引擎种类和格式
在这里引用引擎模板和写入数据后,在需要应用的html页面{{ name}}包裹起来
- 模板引擎语法
- layout.html 布局模板
- 模板继承
- extend是用来引入的
- 留坑
留坑后给需要引用的网页diy内容
路由设计
-
把路由功能分离出到一个页面
在基本功能页加载 : var route = require(’./router’)
在route页面挂载: module.exports = router
在基本功能页挂载: app.use(router) -
页面之间的链接
router.get(’/login’, function (req, res) {
res.render(‘login.html’)
}) -
获取表单提交数据
-
操作数据库
-
发送响应
- mongoose 用户表功能设计
var mongoose = require('mongoose')
// 连接数据库
mongoose.connect('mongodb://localhost/test', { useMongoClient: true })
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)
- 获取完表单数据以后,在router的post请求里开始判断是否满足条件
- 服务端
router.post('/login', function (req, res) {
// 1. 获取表单数据
// 2. 查询数据库用户名密码是否正确
// 3. 发送响应数据
var body = req.body
User.findOne({
email: body.email,
password: md5(md5(body.password))
}, function (err, user) {
if (err) {
return res.status(500).json({
err_code: 500,
message: err.message
})
}
// 如果邮箱和密码匹配,则 user 是查询到的用户对象,否则就是 null
if (!user) {
return res.status(200).json({
err_code: 1,
message: 'Email or password is invalid.'
})
}
// 用户存在,登陆成功,通过 Session 记录登陆状态
req.session.user = user
res.status(200).json({
err_code: 0,
message: 'OK'
})
})
})
客户端的判断
<script>
$('#register_form').on('submit', function (e) {
e.preventDefault() //阻止其他事件提交,这里是异步提交的方式
var formData = $(this).serialize()
console.log(formData)
$.ajax({
url: '/register',
type: 'post',
data: formData,
dataType: 'json',
success: function (data) {
var err_code = data.err_code
if (err_code === 0) {
// window.alert('注册成功!')
// 服务端重定向针对异步请求无效
window.location.href = '/'
} else if (err_code === 1) {
window.alert('邮箱已存在!')
} else if (err_code === 2) {
window.alert('昵称已存在!')
} else if (err_code === 500) {
window.alert('服务器忙,请稍后重试!')
}
}
})
})
</script>
- 遇到的问题 : 在没有ajax时表单提交行为
在没有ajax之前,用的方法是让当前页面返回值,在当前页面渲染出来
渲染在当前页面
这是只能在服务端处理
同步请求的重定向register才有用,异步请求服务端重定向不生效
session的使用方法: 在node中配置 express-session
配置完成以后,在客户端记录req.session.user = user记录,这样就拿到了数据对象,根据自己想要实现的功能去用
login 的去请求异步操作
客户端功能
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<link rel="stylesheet" href="/node_modules/bootstrap/dist/css/bootstrap.css">
<link rel="stylesheet" href="/public/css/login.css">
</head>
<body>
<div class="main">
<div class="header">
<a href="/">
<img src="/public/img/logo3.png" alt="">
</a>
<h1>用户登录</h1>
</div>
<form id="login_form">
<div class="form-group">
<label for="">邮箱</label>
<input type="email" class="form-control" id="" name="email" placeholder="Email" autofocus>
</div>
<div class="form-group">
<label for="">密码</label>
<a class="pull-right" href="">忘记密码?</a>
<input type="password" class="form-control" id="" name="password" placeholder="Password">
</div>
<div class="checkbox">
<label>
<input type="checkbox">记住我
</label>
</div>
<button type="submit" class="btn btn-success btn-block">登录</button>
</form>
<div class="message">
<p>没有账号? <a href="/register">点击创建</a>.</p>
</div>
</div>
<script src="/node_modules/jquery/dist/jquery.js"></script>
<script>
$('#login_form').on('submit', function (e) {
e.preventDefault()
var formData = $(this).serialize()
console.log(formData)
$.ajax({
url: '/login',
type: 'post',
data: formData,
dataType: 'json',
success: function (data) {
var err_code = data.err_code
if (err_code === 0) {
// window.alert('注册成功!')
// 服务端重定向针对异步请求无效
window.location.href = '/'
} else if (err_code === 1) {
window.alert('邮箱或者密码错误')
} else if (err_code === 500) {
window.alert('服务器忙,请稍后重试!')
}
}
})
})
</script>
</body>
</html>
- 服务端功能
router.get('/login', function (req, res) {
res.render('login.html')
})
router.post('/login', function (req, res) {
// 1. 获取表单数据
// 2. 查询数据库用户名密码是否正确
// 3. 发送响应数据
var body = req.body
User.findOne({
email: body.email,
password: md5(md5(body.password))
}, function (err, user) {
if (err) {
return res.status(500).json({
err_code: 500,
message: err.message
})
}
// 如果邮箱和密码匹配,则 user 是查询到的用户对象,否则就是 null
if (!user) {
return res.status(200).json({
err_code: 1,
message: 'Email or password is invalid.'
})
}
// 用户存在,登陆成功,通过 Session 记录登陆状态
req.session.user = user
res.status(200).json({
err_code: 0,
message: 'OK'
})
})
})
- 退出
router.get('/logout', function (req, res) {
// 清除登陆状态
req.session.user = null
// 重定向到登录页
res.redirect('/login')
})