最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • eggjs 无法获取到 session 问题

    正文概述 掘金(宇小墨)   2020-12-02   1008

    近期在做 胖哥的博客项目,遇到一个 eggjs 的坑

    后台接口配置:

    // src/config/apiUrl.js
    
    let ipUrl = 'http://127.0.0.1:7001/admin/'
    
    let servicePath = {
      getTypeInfo: ipUrl + 'getTypeInfo',  //  获得文章类别信息
      checkLogin: ipUrl + 'checkLogin',  //  检查用户名密码是否正确
      addArticle:ipUrl + 'addArticle' ,  //  添加文章
      updateArticle:ipUrl + 'updateArticle' ,  //  修改文章第api地址
    
    }
    export default servicePath;
    
    

    server 端 eggjs 配置

    'use strict';
    
    /**
     * @param {Egg.EggAppInfo} appInfo app info
     */
    module.exports = appInfo => {
      /**
       * built-in config
       * @type {Egg.EggAppConfig}
       **/
      const config = exports = {};
    
      // use for cookie sign key, should change to your own and keep security
      config.keys = appInfo.name + '_1606377868008_4639';
    
      // add your middleware config here
      config.middleware = [
        
      ];
    
      // add your user config here
      const userConfig = {
        // myAppName: 'egg',
      };
    
      config.mysql = {
        client: {
          // ...
      }
    
    
      config.security = {
        csrf: {
          enable: false
        },
        domainWhiteList: ['*']
      };
      config.cors = {
        credentials: true,  // 允许Cook可以跨域
        origin: 'http://localhost:3000', //只允许这个域进行访问接口
        allowMethods: 'GET,HEAD,PUT,POST,DELETE,PATCH,OPTIONS'
      };
    
      return {
        ...config,
        ...userConfig,
      };
    };
    

    设置 session

    async checkLogin() {
        let userName = this.ctx.request.body.userName
        let password = this.ctx.request.body.password
        const sql = " SELECT name FROM users WHERE name = '" + userName +
          "' AND password = '" + password + "'"
    
        const res = await this.app.mysql.query(sql)
        console.log('res: ', res);
        if (res.length > 0) {
          //登录成功,进行session缓存
          let openId = new Date().getTime()
          this.ctx.session.openId =  openId
          this.ctx.body = { 'data': '登录成功', 'openId': openId }
          console.log('this.ctx.session', this.ctx.session);
        } else {
          this.ctx.body = { data: '登录失败' }
        }
      }
    
    

    中间件取 session

    // /middleware/adminauth.js
    module.exports = options => {
      return async function adminauth(ctx, next) {
        console.log('ctx.session.openId----', ctx.session);
    
        // 这里死活拿不到 session.openId
        if (ctx.session.openId) {
          await next();
        } else {
          ctx.body = {
            data: '未登录',
          };
        }
      };
    };
    

    路由中使用 中间件

    /**
     * @param {Egg.Application} app - egg application
     */
    module.exports = app => {
    
      const { router, controller } = app
      const adminauth = app.middleware.adminauth();
      router.post('/admin/checkLogin', controller.admin.main.checkLogin)
      
      // 接口直接报错 未登录
      router.get('/admin/getTypeInfo', adminauth, controller.admin.main.getTypeInfo)
    };
    

    通过 server 端配置可以看到,允许跨域的 ip 为 http://localhost:3000 ,而 后台启动的地址也确实是在这个地址上,但是这样拿不到 session,debug 半天和看文档,没整明白,后面查到原因居然是因为 前端请求地址问题

    后台接口代码应该为:

    // src/config/apiUrl.js
    // 这里不一样
    // let ipUrl = 'http://127.0.0.1:7001/admin/'
    let ipUrl = 'http://localhost:7001/admin/'
    
    let servicePath = {
      // ...
    
    }
    export default servicePath;
    
    

    参考资料:

    • 关于egg.js在中间件中无法获取session跟cookie的原因
    • Eggjs-中间件(Middleware)

    起源地下载网 » eggjs 无法获取到 session 问题

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元