node注册和登录学习

用到的插件

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类型

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,122评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,070评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,491评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,636评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,676评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,541评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,292评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,211评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,655评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,846评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,965评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,684评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,295评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,894评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,012评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,126评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,914评论 2 355

推荐阅读更多精彩内容