用到的插件
express => express 库
jsonwebtoken => 生成token 插件
bcrypt => 密码加密插件
cors => 跨域插件
mongoose => mongo 数据库插件
modules 层
const mongoose = require('mongoose')
const bcry = require('bcrypt');
// 连接数据库, 没有则创建
mongoose.connect('mongodb://localhost:27017/express-auth', {
useCreateIndex: true,
useNewUrlParser: true
// useUnifiedTopology: true
})
// 定义模型
const Schema = new mongoose.Schema({
username: { type: String, unique: true},
password: { type: String,
set(val) {
return bcry.hashSync(val, 10)
}
}
})
const User = mongoose.model("User", Schema)
module.exports = {User}
server.js
const {User} = require('./models.js')
const express = require('express')
// 简明库 token
const jwt = require('jsonwebtoken')
const miyao = 'fdsfsdfsdf' // 服务器的秘钥
// 加密库
const bcr = require('bcrypt')
// 解决跨域问题
const cors = require('cors')
const app = express()
// 使用express.json 中间键
app.use( express.json() )
app.all('*', function(req, res, next) {
let port = req.headers.origin.split(':').pop();
res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:'+ port)
res.header('Access-Control-Allow-Headers', 'X-Requested-With, mytoken')
res.header('Access-Control-Allow-Headers', 'X-Requested-With, Authorization')
res.setHeader('Content-Type', 'application/json;charset=utf-8')
res.header('Access-Control-Allow-Headers', 'Content-Type,Content-Length, Authorization, Accept,X-Requested-With')
res.header('Access-Control-Allow-Methods', 'PUT,POST,GET,DELETE,OPTIONS')
res.header('X-Powered-By', ' 3.2.1')
next();
});
app.post('/api/register', async (req, res) => {
// 创建一条数据
const user = await User.create({
username: req.body.username,
password: req.body.password
})
res.send(user)
})
app.post('/api/login', async (req, res) => {
const user = await User.findOne({
username: req.body.username
})
if(!user){
return res.status(422).send({
message: '用户名不存在'
})
}
// 如果存在 则比较密码 bcrypt 是一个加密的库
const isPassword = bcr.compareSync(
String(req.body.password),
user.password
)
// console.log(isPassword)
// 生成token jsonwebtoken
// console.log(user._id)
const token = jwt.sign({
_id: String(user._id)
}, miyao)
res.send({
user,
token: token
})
})
app.get('/api/profile', async (req, res) => {
const raw = String(req.headers.authorization).split(" ").pop();
console.log(raw)
const id = jwt.verify(raw, miyao)
const user = await User.findById(id)
console.log(JSON.stringify(user))
console.log("=========")
res.send(JSON.stringify(user))
})
app.listen(3000, () => {
console.log('http://localhost:3000')
})
response
res.send( data ) => 传送 HTTP 响应
res.json() =>传送JSON响应
res.append() => 追加指定HTTP 头
res.set() => 在res.append()后将重置之前设置的头
res.cookie() => 设置 cookie
res.clearCookie() => 清除Cookie
res.download( ) =>传送指定路径的文件
res.get() => 返回指定的HTTP头
res.location():只设置响应的Location HTTP头,不设置状态码或者close response
res.redirect():设置响应的Location HTTP头,并且设置状态码302
res.sendFile(path [,options] [,fn]):传送指定路径的文件 -会自动根据文件extension设定Content-Type
res.set():设置HTTP头,传入object可以一次设置多个头
res.status():设置HTTP状态码
res.type():设置Content-Type的MIME类型