求助:call failed:, { errMsg: "request:fail invalid url "classic/200/1/favor""}

来源:10-2 解决缓存带来的问题

每天一个八公里

2023-03-19

为了解决缓存中 classic 的 like_status 和 fav_nums 不是最新数据的问题,我采用了以下逻辑来实现,但却爆出了标题中的错误,研究了一上午,实在找不到问题出在哪里,向老师求助,具体情况如下:

业务逻辑是这样的,在调用本地缓存 classic 进行页面渲染前,先确认本地是否存在该 key 名称的缓存,如果存在,则以 classicModel 中定义的以下函数向服务器请求最新的 like_status 和 fav_num 并且更新在本地缓存的 classic 中。

以下是 pages/classic/classic.js 实现业务逻辑的代码:

updataClassic(event) {
		let isPrevious = event.detail.isPrevious
		let index = this.data.classic.index
		let key = classicModel._getKey(isPrevious?index-1:index+1)
		// 如果缓存中存在该 classic, 则向服务器请求最新的 like_status 和 fav_nums 信息更新到缓存中相应的 classic		
		if(wx.getStorageSync(key)) {
			let classic = classicModel._getClassicFromStorage(key)
			let type = classic.type
			let id = classic.id
			classicModel.updataLikeStatus(type, id, (res) => {
			console.log(res)
			// classic.like_status = res.like_status
			// classic.fav_nums = res.fav_nums
		})
			wx.setStorageSync(key, classic)
		}
		// 如果缓存中存在该 classic 则调用缓存中的数据
		if(wx.getStorageSync(key)) {
			this.setData({
				classic: classicModel._getClassicFromStorage(key),
				first: classicModel.isFirst(isPrevious?index-1:index+1),
				latest: classicModel.isLatest(isPrevious?index-1:index+1)
			})
		}
		// 当前期刊不在缓存中则向服务器请求数据并将数据存储在缓存中
		else
		{
			classicModel.getClassic(index, isPrevious, (res) => {
				this.setData({
					classic: res,
					first: classicModel.isFirst(res.index),
					latest: classicModel.isLatest(res.index)
				})
				wx.setStorageSync(key, res)
			})
		}
	},

但始终无法得到预期结果。通过在 sCallback 中打印 res 发现,调用 classicModel 的 updataLikeStatus 方法返回的 res 是 undefined,同时控制台报出了标题中的错误

console报错:
call failed:, {errno: 600009, errMsg: "request:fail invalid url "classic/200/1/favor""}

我理解它是说“classic/200/1/favor”这个地址不正确,但这个 API 文档中规定的格式一样(GET classic/int:type/int:id/favor),type 和 id 的数据类型也都是 Int,各种测试研究了一上午,实在找不到到底问题出在哪里了,向老师求助。

以下是 classicModel 的 updataLikeStatus 方法的定义:

updataLikeStatus(type, id, sCallback) {
		wx.request({
			url: `classic/${type}/${id}/favor`,
			method: 'GET',
			success: (res) => {
				sCallback(res)
			}
		})
	}
写回答

1回答

每天一个八公里

提问者

2023-03-19

终于一步一步排查出问题所在了:

1. 当我测试发现在 updataLikeStatus 内部的 url 参数给定完整地址的时候,报错就不一样了,报错为 401,提示 appKey 不正确;

2. 检查并确认了 HTTP 对 config.js 文件的引用,以及 classicModel 对 HTTP 的引用,都没有错

3. 测试在 updataLikeStatus 内部通过 header 载入 appKey,错误消失

4. 综上,看来是 updataLikeStatus 通过 HTTP 对 config.js 引用时发生的错误,由于第二部的确认,可以断定是  updataLikeStatus 引用 HTTP 过程发生了错误

5. 回顾头来再仔细一看,原来是 updataLikeStatus 中引用 HTTP 的 request 方法时,把 this 写成了 wx,变成了调用 wx.request 接口

6. 把wx.request 改成 this.request 问题解决了


总结:使用父类方法时,记住加“this.”。

1
0

纯正商业级微信小程序应用实战,全方位小程序特性讲解

真实数据的高质量小程序项目,学会直接工作

4782 学习 · 2125 问题

查看课程