tencentyun / wafer2-startup

Wafer - 腾讯云下一代小程序综合解决方案
1.02k stars 225 forks source link

wafer2 demo 问题Cannot read property 'skey' of null #137

Closed pigling closed 6 years ago

pigling commented 6 years ago

我这个问题是在两个demo, wafer2-quickstart和wafer2-startup两边都有这个问题,都试无法拿到skey,但是奇怪的是,似乎只有我一个人碰到这个问题,google上面找到一个类似的php demo的解决方案其实对我没有帮助。我在腾讯云论坛上发这个问题,但是没有得到一个好的答案https://cloud.tencent.com/developer/ask/126297

wafer2-quickstart下载了代码,然后设置开发环境包括appid,appsecret还有request url以后,可以登录,上传图片,但是唯独检测cgi的时候报错: VM143:1 thirdScriptError Cannot read property 'skey' of null;at pages/addCgi/addCgi page testCgi function TypeError: Cannot read property 'skey' of null at doRequest (http://127.0.0.1:49287/appservice/vendor/wafer2-client-sdk/lib/request.js:83:55) at Object.request (http://127.0.0.1:49287/appservice/vendor/wafer2-client-sdk/lib/request.js:72:9) at e.testCgi (http://127.0.0.1:49287/appservice/pages/addCgi/addCgi.js:17:16) at e.<anonymous> (http://127.0.0.1:49287/appservice/__dev__/WAService.js:18:4907) at e.a (http://127.0.0.1:49287/appservice/__dev__/WAService.js:17:31002) at z (http://127.0.0.1:49287/appservice/__dev__/WAService.js:17:24941) at Function.<anonymous> (http://127.0.0.1:49287/appservice/__dev__/WAService.js:17:26562) at http://127.0.0.1:49287/appservice/__dev__/WAService.js:18:509 at http://127.0.0.1:49287/appservice/__dev__/WAService.js:6:26768 at e.(anonymous function) (http://127.0.0.1:49287/appservice/__dev__/WAService.js:4:4917) 我也看了一下代码,是 var authHeader = buildAuthHeader(Session.get().skey); 既然有Session.get,那么肯定有Session.set,但是set只在login里面才有,而代码中并没有call到login。我自己有强制插入login代码,但是在wafer2-client-sdk/login.js `/**

这个问题困扰我好几天了,请求大家帮助,谢谢。

Jekin6 commented 6 years ago

我也碰到了这个问题,就是Session.get().skey 时出错,Session.get() 得到的是null。不知怎么解决

pigling commented 6 years ago

在get之前应该先有set,因为skey的默认值是null啊。@jekin6你有自己强制call login.js里面的login函数吗?那里有Session.set()。

Jekin6 commented 6 years ago

@pigling 我在testCgi函数里调一下qcloud.setLoginUrl(config.service.loginUrl) 把loginUrl设置一下就可以了,在wafer2-client-sdk/lib/login.js 里涉及到登录的函数里都会先检查一下有没有设置loginUrl,没有的话就直接抛错return了,根本不会去登录,就没有设置Session信息,所以Session.get()是拿不到任何信息的。

    testCgi: function () {
      qcloud.setLoginUrl(config.service.loginUrl);
        util.showBusy('请求中...')
        var that = this
        qcloud.request({
            url: `${config.service.host}/weapp/demo`,
            login: false,
            success (result) {
                util.showSuccess('请求成功完成')
                that.setData({
                    requestResult: JSON.stringify(result.data)
                })
            },
            fail (error) {
                util.showModel('请求失败', error);
                console.log('request fail', error);
            }
        })
    },
jas0ncn commented 6 years ago

已经改成使用 qcloud.requestLogin 这个接口了哈

Jekin6 commented 6 years ago

@jas0ncn 即使改成用qcloud.requestLogin 也需要在调这个方法前设置一下loginUrl吧,要不然还是没有发生请求就return了

  if (!/http/.test(defaultOptions.loginUrl)) {
    options.fail(new LoginError(constants.ERR_INVALID_PARAMS, '登录错误:缺少登录地址,请通过 setLoginUrl() 方法设置登录地址'));
    return;
  }
justforhing commented 6 years ago

https://cloud.tencent.com/developer/ask/126297 参照这篇解答,已经解决

pigling commented 6 years ago

谢谢各位朋友的帮忙,但是qcloud.setLoginUrl(config.service.loginUrl)没有实质上解决这个问题。因为在client/app.js里面就已经有了这句

//app.js var qcloud = require('./vendor/wafer2-client-sdk/index') var config = require('./config')

App({ onLaunch: function () { qcloud.setLoginUrl(config.service.loginUrl) } })


然后在client/index.js里面的bindGetUserInfo

bindGetUserInfo: function (e) { if (this.data.logged) { return; } util.showBusy('正在登录');

var that = this; var userInfo = e.detail.userInfo;

// 查看是否授权 wx.getSetting({ success: function (res) { if (res.authSetting['scope.userInfo']) {

    // 检查登录是否过期
    wx.checkSession({
      success: function () {
        // 登录态未过期
        util.showSuccess('登录成功');
        that.setData({
          userInfo: userInfo,
          logged: true
        })
      },

      fail: function () {
        qcloud.clearSession();
        // 登录态已过期,需重新登录
        var options = {
          encryptedData: e.detail.encryptedData,
          iv: e.detail.iv,
          userInfo: userInfo
        }
        that.doLogin(options);
      },
    });
  } else {
    util.showModel('用户未授权', e.detail.errMsg);
  }
}

}); }, ` 在这个登录中的过程里面,根本没有机会call login.js中的requestlogin函数。整个流程完全就没有看到任何可以碰到session的设置的地方。wx.chechSession也没有检查session_key啊。

pigling commented 6 years ago

我将bindGetUserInfo函数改成以下的样子,强制转向requestLogin,但是用模拟器和手机拿出来的错误不一样

bindGetUserInfo: function (e) { if (this.data.logged) { return; } util.showBusy('正在登录');

var that = this; var userInfo = e.detail.userInfo; qcloud.clearSession(); // 登录态已过期,需重新登录 var options = { encryptedData: e.detail.encryptedData, iv: e.detail.iv, userInfo: userInfo };

  that.doLogin(options);

/* // 查看是否授权 wx.getSetting({ success: function (res) { if (res.authSetting['scope.userInfo']) {

    // 检查登录是否过期
    wx.checkSession({
      success: function () {
        // 登录态未过期
        util.showSuccess('登录成功');
        that.setData({
          userInfo: userInfo,
          logged: true
        })
      },

      fail: function () {
        qcloud.clearSession();
        // 登录态已过期,需重新登录
        var options = {
          encryptedData: e.detail.encryptedData,
          iv: e.detail.iv,
          userInfo: userInfo
        }
        that.doLogin(options);
      },
    });
  } else {
    util.showModel('用户未授权', e.detail.errMsg);
  }
}

}); */ }, 模拟器报错:

LoginError {type: "ERR_LOGIN_MISSING_SESSION", message: "{"code":-1,"error":"ERR_IN_DECRYPT_DATA\nError: er…velope routines:EVP_DecryptFinal_ex:bad decrypt"}"}message: "{"code":-1,"error":"ERR_IN_DECRYPT_DATA\nError: error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt"}"type: "ERR_LOGIN_MISSING_SESSION"proto: Error at http://127.0.0.1:47246/appservice/vendor/wafer2-client-sdk/lib/login.js:18:28 at http://127.0.0.1:47246/appservice/vendor/wafer2-client-sdk/lib/login.js:22:2 at require (http://127.0.0.1:47246/appservice/__dev__/WAService.js:18:27248) at http://127.0.0.1:47246/appservice/__dev__/WAService.js:18:26997 at http://127.0.0.1:47246/appservice/vendor/wafer2-client-sdk/index.js:4:13 at require (http://127.0.0.1:47246/appservice/__dev__/WAService.js:18:27248) at http://127.0.0.1:47246/appservice/__dev__/WAService.js:18:26997 at http://127.0.0.1:47246/appservice/app.js:4:14 at require (http://127.0.0.1:47246/appservice/__dev__/WAService.js:18:27248) at http://127.0.0.1:47246/appservice/appservice?t=1531368683138:1022:9

而手机报错:

LoginError {type: "ERR_LOGIN_FAILED", message: "登录失败,可能是网络错误或者服务器发生异常"}message: "登录失败,可能是网络错误或者服务器发生异常"type: "ERR_LOGIN_FAILED"proto: Error at weapp:///vendor/wafer2-client-sdk/lib/login.js:18:28 at weapp:///vendor/wafer2-client-sdk/lib/login.js:22:2 at require ([publib]:22:20279) at [publib]:22:19993 at weapp:///vendor/wafer2-client-sdk/index.js:4:13 at require ([publib]:22:20279) at [publib]:22:19993 at weapp:///app.js:4:14 at require ([publib]:22:20279) at weapp:///app.js:14:2

虽然报错选项不一样,但是具体报错地点都是一样的。我在requestLogin之前有加上qcloud.setLoginUrl(config.service.loginUrl)。