详解nuxt路由鉴权(express模板)


Posted in Javascript onNovember 21, 2018

这里我们以用户登录鉴权为例

express依赖express-session中间件实现session功能

若我们不加载express-session组件

router.get('/user/login', function (req, res) {
 console.log(req,req.session)
})

会发现不存在session对象

引入express-session组件

// server/index.js文件
...
import session from 'express-session'
...
app.use(session)
...

然后再试试

router.get('/user/login', function (req, res) {
 console.log(req.session)
})

这时可以看到打印出空数组对象。。。好了,下面就可以使用了

import {Router} from 'express'
const router = Router()
import request from 'superagent'
router.get('/user/login', function (req, res) {
  request
   .get(path)
   .query(req.query)
   .set('Content-Type', 'application/json;charset=UTF-8')
   .end((err, _res) => {
    if (_res.body.code === 200) {
     req.session.authUser = _res.body.data //将返回的用户数据存到session
    }
    res.json(_res.body)
   })
}

seeesion搞定了,怎么进行鉴权呢?

首先,将用户session保存到store,以便全局取用
nuxtServerInit 方法:如果在状态树中指定了 nuxtServerInit 方法,Nuxt.js 调用它的时候会将页面的上下文对象作为第2个参数传给它(服务端调用时才会酱紫哟)。当我们想将服务端的一些数据传到客户端时,这个方法是灰常好用的。

举个例子,假设我们服务端的会话状态树里可以通过 req.session.user 来访问当前登录的用户。将该登录用户信息传给客户端的状态树,我们只需更新 store/index.js 如下:

actions: {
 nuxtServerInit ({ commit }, { req }) {
  if (req.session.user) {
   commit('user', req.session.user)
  }
 }
}

这样我们就可以通过判断store中user的状态来知道用户是否登录。

在跳转时需要鉴权的页面添加中间件:

export default{
  middleware: auth
}

auth.js

export default function ({store,redirect}) {
 if (!store.state.authUser) {
    return redirect('/user/login')
  }
}

大概流程:a?>b middleware鉴权未登录,跳转登录页面登录,调用登录接口保存用户session,返回a,再次跳转b,nuxtServerInit 从上下文对象中获取session保存在store,鉴权成功,跳转成功。

拓展:connect-redis

sever/index配置

import express from 'express'
import {
 Nuxt,
 Builder
} from 'nuxt'
import session from 'express-session'
import redis from 'connect-redis'
import bodyParser from 'body-parser'
import api from './api'
import serverConfig from './config' //redis配置文件

const app = express()
const host = process.env.HOST || '127.0.0.1'
const port = process.env.PORT || 3000

const RedisStore = redis(session)
app.use(bodyParser.json())

app.use('/static', express.static('static'))

app.use(session({
 name: 'sid',
 secret: 'Asecret123-',
 resave: true,
 rolling: true,
 saveUninitialized: false,
 store: new RedisStore(serverConfig)
}))

app.set('port', port)

// Import API Routes
app.use('/api', api)

app.use('/', api)

// Import and Set Nuxt.js options
let config = require('../nuxt.config.js')
config.dev = !(process.env.NODE_ENV === 'production')

// Init Nuxt.js
const nuxt = new Nuxt(config)

// Build only in dev mode
if (config.dev) {
 const builder = new Builder(nuxt)
 builder.build()
}

// Give nuxt middleware to express
app.use(nuxt.render)

// Listen the server
app.listen(port, host)
console.log('Server listening on ' + host + ':' + port) // eslint-disable-line no-console

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript flash下fromCharCode和charCodeAt方法使用说明
Jan 12 Javascript
JS 事件绑定函数代码
Apr 28 Javascript
IE的有条件注释判定IE版本详解(附实例代码)
Jan 04 Javascript
jQuery实现自动与手动切换的滚动新闻特效代码分享
Aug 27 Javascript
深入理解jquery中的事件与动画
May 24 Javascript
javascript 内置对象及常见API详细介绍
Nov 01 Javascript
bootstrap Table的一些小操作
Nov 01 Javascript
javascript实现计算指定范围内的质数示例
Dec 29 Javascript
vue watch关于对象内的属性监听
Apr 22 Javascript
Vue开发之封装分页组件与使用示例
Apr 25 Javascript
Vue+Node实现的商城用户管理功能示例
Dec 23 Javascript
vue各种事件监听实例(小结)
Jun 24 Javascript
使用vue-cli webpack 快速搭建项目的代码
Nov 21 #Javascript
Angular刷新当前页面的实现方法
Nov 21 #Javascript
详解ES6系列之私有变量的实现
Nov 21 #Javascript
jQuery实现上下滚动公告栏详细代码
Nov 21 #jQuery
Vue.js 中 axios 跨域访问错误问题及解决方法
Nov 21 #Javascript
vue  directive定义全局和局部指令及指令简写
Nov 20 #Javascript
详解Vue.js在页面加载时执行某个方法
Nov 20 #Javascript
You might like
session 的生命周期是多长
2006/10/09 PHP
PHP底层运行机制与工作原理详解
2020/07/31 PHP
HTML-CSS群中单选引发的“事件”
2007/03/05 Javascript
基于jQuery的弹出消息插件 DivAlert之旅(一)
2010/04/01 Javascript
json格式化/压缩工具 Chrome插件扩展版
2010/05/25 Javascript
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
什么是json和jsonp,jQuery json实例详详细说明
2012/12/11 Javascript
JS将制定内容复制到剪切板示例代码
2014/02/11 Javascript
干货分享:让你分分钟学会javascript闭包
2015/12/25 Javascript
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
JS组件系列之JS组件封装过程详解
2017/04/28 Javascript
JS异步函数队列功能实例分析
2017/11/28 Javascript
JavaScript体验异步更好的解决办法
2018/01/08 Javascript
js实现跟随鼠标移动的小球
2019/08/26 Javascript
JS立即执行的匿名函数用法分析
2019/11/04 Javascript
小程序中设置缓存过期的实现方法
2020/01/14 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
三步搞定:Vue.js调用Android原生操作
2020/09/07 Javascript
Python实现获取网站PR及百度权重
2015/01/21 Python
python实现换位加密算法的示例
2018/10/14 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
django3.02模板中的超链接配置实例代码
2020/02/04 Python
python计算导数并绘图的实例
2020/02/29 Python
Django添加bootstrap框架时无法加载静态文件的解决方式
2020/03/27 Python
AmazeUI 输入框组的示例代码
2020/08/14 HTML / CSS
白宫黑市官网:White House Black Market
2016/11/17 全球购物
英国最大的宠物商店:Pets at Home
2019/04/17 全球购物
Luxplus荷兰:以会员价购买美容产品等,独家优惠
2019/08/30 全球购物
施华洛世奇新加坡官网:SWAROVSKI新加坡
2020/10/06 全球购物
顺丰快递Java软件工程师面试题
2015/07/31 面试题
优秀求职信范文分享
2014/01/26 职场文书
国庆宣传标语
2014/06/30 职场文书
2014年行政工作总结
2014/11/19 职场文书
敬业奉献模范事迹材料
2014/12/24 职场文书
2016元旦主持人经典开场白台词
2015/12/03 职场文书
WINDOWS下安装mysql 8.x 的方法图文教程
2022/04/19 MySQL