模块调用问题:
uniapp的客户端只能用ecmascript module标准来调用模块,也就是说,使用export {mod1,mod2}来导出对象或者函数,用import {aaa,bbb} from xxx来引入模块。
而serverless服务端unicloud(我用的阿里云版本)只能使用CommonJS约定来调用模块,也就是说,用module.exports对象来表示被导出的对象,用require来获取其他js模块。可以用相对路径,对于npm之类安装的node_modules模块,可以直接用模块名require。这很容易出问题,在客户端可用的那些支持ecma标准的代码需要改造才能运行在serverless服务端,并且很重要一点,如果你引用了ecma标准的模块也是不能直接在serverless服务端使用,通常这种情况会报”未知的关键字 import”的错误,因为import是ecma标准的,在服务端只能用require。
然后我在开发数据抓取和获取其他网站api的时候,首先是在客户端写这部分代码,结果发布之后,我当然没有别人网站的跨域授权,所以在HBuilderX里可以运行的代码到了浏览器里遇到跨域限制就不再可用了。没办法移动到服务端,随后发现上述的这个模块引用标准不同的问题。我把代码改造之后还是报错,后来仔细查看报错信息调用堆栈,发现报错出现在node_modules里面的代码,是引用的库里用了ecma标准也是不行。然后我就换了几个其他的通信库,一开始是axios,遇到前述问题,然后换了fetch,它在node.js里很正常,但是搬到serveless云函数后发现引用的Headers等几个对象不存在,我也不知道serverless里的node版本老到了什么程度(汗颜)。然后换了https内置模块,但是无法正确的传递参数,最后还是换回axios,只不过是降了版本,因为我到github网站上查了它的代码历史,发现在0.x版本的时候,它用的是commonjs标准,毕竟这个才是先出现的标准,ecma是最近几年才普及的标准。最终使用0.27.2版本的axios完美解决了问题。为了方便以后复用,我把这套代码再封了一层做成了服务端公共模块cjrest。再做几个项目完善一下的话可能会开源出来。
使用cjrest的时候遇到一些不同的请求格式的情况。默认格式是json,需要在config的format参数里指定哪种格式,格式列表参考apifox里的body格式
db.collection(“xxx”)需要用await 获取结果 ,然后返回的是一个可查询对象。要用可查询对象来进行add update remove等操作。获取结果要用get(),返回的是一个对象,一个字段记录影响了多少个记录,另外一个data就是获取到的对象数组。如果只获取一个,还需要加一个[0]。另外一个经常出现的错误是简写要把await放在括号内,比如
let obj = (await (await db.collection(“xxx”)).get()).data[0];
这里如果没有await前的(这一对括号,get方法会对一个Promise对象,而不是数据表取值,会造成“get不是一个方法”的错误。
unicloud cron定时任务的问题
云对象如果配置了 cron,会定时调用它的_timing方法,而和cron名称字段无关。另外配置云对象的serverless属性,需要把那些设置放在package.json的cloudfunction-config字段下,下面是个例子:
{
"name": "gpu-router",
"version": "1.0.0",
"description": "gpu算力调度模块",
"main": "index.obj.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"cloudfunction-config": {
"memorySize": 512,
"triggers": [
{
"name": "check_gpu_state",
"type": "timer",
"config": "3 * * * * * *"
}
],
"timeout": 60,
"path": "",
"keepRunningAfterReturn": false
},
"keywords": [],
"author": "fancybit",
"license": "MIT",
"dependencies": {
"async-lock": "^1.4.0",
"cjrest": "file:../common/cjrest",
"date-ext": "file:../common/date-ext",
"delay": "file:../common/delay"
},
"extensions": {
"uni-cloud-jql": {}
}
}
腾讯云的cron表达式不支持 ? 用*代替
checkbox radiobox相关
checkbox通常放在一个checkbox-group组中,然后从checkboxgroup里面注册@change=xxx,在回调函数里,然后每个checkbox里放一个无需绑定的值,这个时候点击任何checkbox,checkbox-group组件注册的@chage回调里的参数e的e.details.value是一个数组,里面存放了所有被勾选的checkbox的value。
radiobox也是类似,区别是radiobox-group传给@change回调的e.detals.value存放的是单一的值而不是一个数组。
当前用户ID
获取当前用户id,可以使用uniCloud.getCurrentUserInfo().uid(服务端是否起效未测试)
有关云对象
云对象中的方法在调用本对象的其他方法时不能用this,需要先用uniCloud.importObject(“云对象名”)获取自身引用后再调用它的其他方法。this并不是自身对象,而是存放了一些附加信息,比如:
const db = uniCloud.databaseForJQL({
clientInfo: this.getClientInfo()
});
用来创建支持完整JQL的db
点击数:234
???
test