Closed pigling closed 6 years ago
我也碰到了这个问题,就是Session.get().skey 时出错,Session.get() 得到的是null。不知怎么解决
在get之前应该先有set,因为skey的默认值是null啊。@jekin6你有自己强制call login.js里面的login函数吗?那里有Session.set()。
@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);
}
})
},
已经改成使用 qcloud.requestLogin 这个接口了哈
@jas0ncn 即使改成用qcloud.requestLogin 也需要在调这个方法前设置一下loginUrl吧,要不然还是没有发生请求就return了
if (!/http/.test(defaultOptions.loginUrl)) {
options.fail(new LoginError(constants.ERR_INVALID_PARAMS, '登录错误:缺少登录地址,请通过 setLoginUrl() 方法设置登录地址'));
return;
}
https://cloud.tencent.com/developer/ask/126297 参照这篇解答,已经解决
谢谢各位朋友的帮忙,但是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啊。
我将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)。
我这个问题是在两个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 `/**@param {Function} options.fail(error) 登录失败后的回调函数,参数 error 错误信息 */ var login = function login(options) {
options = utils.extend({}, defaultOptions, options);
if (!/http/.test(defaultOptions.loginUrl)) { options.fail(new LoginError(constants.ERR_INVALID_PARAMS, '登录错误:缺少登录地址,请通过 setLoginUrl() 方法设置登录地址')); return; }
var doLogin = () => getWxLoginResult(function (wxLoginError, wxLoginResult) { if (wxLoginError) { options.fail(wxLoginError); return; }
最后这个options.data根本就没有define,导致wx.request就完全没反应了。
这个问题困扰我好几天了,请求大家帮助,谢谢。