- batchDownloadFile(http api)的max_age是什么作用?
HTTP API中的获取文件下载链接batchDownloadFile,请求参数中需要每个文件的:fileId,max_age。 资料说max_age是下载链接有效期。有效期需要用户提供吗?每个文件都要提供,各文件不同?
2023-01-03 - 公众号测试账号菜单的各项链接间可以用Session吗?
公众号菜单的各项链接(同一个后台 http server)之间可以用Session吗?经过测试可用。 公众号测试账号内创建菜单,两个菜单项,type都是view, url分别是 http://abc.com/a1.aspx 和 http://abc.com/a2.aspx 在 a1.aspx 内为 Session["aaa"] 赋值:a1。 在 a2.aspx 内读取 Session["aaa"]。读取结果就是 a1。 这表明菜单项之间可用 Session。没问题吧?
2021-05-15 - 微信公众号运营第二讲:公众号注册、起名、认证-基础篇
公众号注册地址:https://mp.weixin.qq.com(免费,人人都可以注册) 1、每个邮箱只能注册一个公众号(如果注册过小程序,那么这个邮箱无法再注册),邮箱解决方案:QQ邮箱-设置-账户,可新建英文邮箱、手机号邮箱都可单独使用,还有其他邮箱比如:163、126、新浪等。 2、个人选择注册订阅号,企业可选择订阅号、服务号。(订阅号、服务号区别) 3、注册流程很简单,输入邮箱、邮箱验证码、密码、确认密码后,你的邮箱就会收到一封微信发来邮件,打开邮箱中的地址,会要求你输入一些个人信息:姓名、身份证、手机号,然后实名微信扫码即可注册成功。 注册成功后,继续打开网址:https://mp.weixin.qq.com,输入注册时的邮箱、密码登录,每次登录都需要管理员扫码。也可以管理员直接扫码登录无需输入账号密码。 [图片] 当你登录成功后,你需要给你的公众号起一个名字,不要随便起名字。因为名字可能决定你公众号自然流量的高低,也就是说用户会不会搜到你的公众号,搜到后你的公众号会不会排在前面。推荐大家使用-微信指数小程序(官方的)。打开微信,下拉搜索【微信指数】 然后输入一些搜索指数高的、稳定的、你喜欢的关键字,作为你的公众号名字。看下图 [图片] 如果指数高的话,说明用户每日搜索的很多,那么你的公众号极有可能出现在用户的搜索列表里。反之,如果你的公众号名字没有搜索指数,基本上不会出现在用户的搜索列表里。公众号的名字要精准定位你要做的内容,让用户一看你的名字,就知道你是做什么的,有助于你后期变现。 公众号介绍尽量多命中你要服务的内容,这样会精准的给你引流自然流量。 [图片] 关于公众号认证的问题: 1、个人号目前只能被灰度认证,也就是微信不邀请你,你认证不了。但是认不认证目前意义不是特别大,专心做好内容,内容为王。 2、企业订阅号、服务号,登录后台,右上角-账号详情,点击认证即可。认证期间会让你支付300块钱,这个是每年都需要交的,如果你不交的话,对应的功能是无法使用的。 [图片]3、如果是做自媒体,只发布文章、视频,订阅号是无需认证的。 关于公众号注销的问题: 登录后台,右上角-账号详情,拉到最下方,点击注销账号。个人可直接注销,点击注销后有7天反悔时间,第七天会收到微信通知是否注销,同意即可注销。企业无对公账户暂不支持注销,注销流程看下图。 [图片]
2020-10-27 - npm(macOS)安装步骤
原文:https://my.oschina.net/piscdong/blog/3113475 本文截取了原文中npm和cnpm的安装部分 安装npm [代码]$ brew install node [代码] npm直接使用淘宝镜像 [代码]$ npm install nrm -g $ nrm use taobao [代码] 或者使用cnpm(不推荐) [代码]$ npm install -g cnpm --registry=https://registry.npm.taobao.org $ npm config set registry https://registry.npm.taobao.org [代码] 完成 补充:安装Homebrew [代码]/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)" [代码] 或者(国内可用) [代码]/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" [代码]
2021-07-08 - 谁有node.js安装包?下载太慢了?
如上。谢谢!
2020-09-08 - 怎样在小程序前端使用 nodejs 的 crypto 模块?
在 node.js 下试着使用 crypto 模块,发现直接 require,不用安装(执行安装命令 npm install crypto 后产生的文件中显示该模块已内置)。问题是开发工具下不能直接 require(执行结果显示找不到此模块)。这时怎样安装 crypto 模块呢? 版本:开发工具:1.03.2009140;开发工具的node.exe:12.6.0.0;node.js:12.19.0.0。
2020-10-19 - AEAD_AES_256_GCM 解密 .net 需要 asp.net 哪个版本?
AEAD_AES_256_GCM 解密 .net 需要 asp.net 哪个版本?
2019-12-26 - 云函数使用uploadFile上传比较大的图片(base64)时,会失败怎么办呢?
如题,云函数使用uploadFile上传比较大的图片(特别是用苹果手机拍出来的照片),上传会失败,云函数代码见下方。 请问大佬们,①上传图片比较好的方法是什么呢?②如果还是使用我这种方法,怎么有效的压缩图片不影响图片质量还能完成上传呢? 感谢感谢! 云函数:exports.main = async (event, context) => { try { return await cloud.uploadFile({ cloudPath: event.path, fileContent: new Buffer(event.file, 'base64') }) } catch (e) { return e; } }
2020-08-26 - 小程序的运行环境与小程序云函数的运行环境不同吗?
小程序云函数(index.js 代码)的运行环境是 node.js ?小程序(index.js 代码)的运行环境也是 node.js ?开发工具下和真机下一样吗?以下代码在云函数时结果是99。而在小程序时结果是10。是否由于解释器不同? var a7=10; { a7=99; function a7(){} a7=30; } console.log("testa7: ", a7) //微信小程序云函数内:99 //微信小程序内 :10
2020-09-20 - 测试阶段有没有免费的“短信验证码登录”功能或者购买少量?
测试阶段有没有免费的“短信验证码登录”功能或者购买少量?据资料1万条起售。但测试阶段用不了这么多。
2020-09-03 - openid 与微信账号、云环境id 都有关系对吗?
经测试,同一微信账号登录不同的小程序(指云环境不同),获得的 openid 不同。所以 openid 是微信账号加云环境(wx-server-sdk)。
2020-07-26 - 地图标记(map marker)在(地图)旋转一圈后消失了?
用 mapmarkers 标记一个位置。当地图(地球)转一圈后标记消失了。这是怎么回事?代码很简单,没有特殊之处。 // index.js Page({ data: { mapmarkers: [{ id: 0, longitude: 119, latitude: 32, width: 15, height: 15, color: "#000000", }], }, }) // index.wxml <map id="id0" markers="{{mapmarkers}}" longitude="119" latitude="32" scale="12" subkey=""></map>
2020-07-20 - 小程序开发:缩小图片并上传
小程序中要把图片缩小再上传,可使用画布组件(canvas)缩小图片。在 wxml 代码中定义画布,位置应在屏幕外,这样就像是在后台处理图片而不显示在屏幕上。wxml 文件中的 canvas 代码: <view style="width:0px;height:0px;overflow:hidden;"> <canvas canvas-id="canvasid1" style="width:600px;height:600px;position:absolute;top:-800px;left:-800px;background-color:#cdcdcd;border:1px solid blue;"> </canvas> </view> 这段代码可处于 wxml 文件的末尾处。 要处理的图片不止一张,在缩小图片的代码中,用递归调用方式: function resize_recursion() { // canvas : resize ctx1.drawImage(arr1[i].file, 0, 0, arr1[i].widthx, arr1[i].heightx) ctx1.draw(false, res => { var lca = wx.canvasToTempFilePath({ x: 0, y: 0, width: arr1[i].widthx, height: arr1[i].heightx, canvasId: 'canvasid1', quality: 1, success: res => { arr1[i].file1 = res.tempFilePath i = i + 1 if(i==arr1.length){ lca = uploadproc() return }else{ return resize_recursion() } }, fail: function (err) { console.log(err) } }) }) // end of draw } 上传图片用到 js 的 Promise对象,提高传输效率: var arrPromise1 = new Array() for (i = 0; i < arr1.length; i++) { arrPromise1.push(new Promise(function (resolve, reject) { wx.cloud.uploadFile({ cloudPath: arr1[i].file1, filePath: arr1[i].file2, success: res => { resolve(res) }, fail: error => { reject(error) } }) })) } Promise.all(arrPromise1).then(res => { for (var i = 0; i < res.length; i++) { arr1[i].upfileId = res[i].fileID } } 图片文件最初来自交互操作:wx.chooseimage(),选定的图片存放在数组arr1中。然后读取图片的尺寸,根据大小来决定是否需要执行缩小代码。这是读取图片大小的代码,也用到 js 的 Promise对象: var arrPromise1 = new Array() for (i = 0; i < arr1.length; i++) { arr1[i] = { "file": arr1[i].path, "file1": '', "upfileId": '', "size": arr1[i].size, "width1": 0, "height1": 0, "widthx": 0, "heightx": 0, "flag": 0, "idx1": 0 } arrPromise1.push(new Promise(function (resolve, reject) { wx.getImageInfo({ src: arr1[i].file, success: res => { resolve(res) }, fail: error => { reject(error) } }) })) } Promise.all(arrPromise1).then(res => { for (i = 0; i < res.length; i++) { arr1[i].width1 = res[i].width arr1[i].height1 = res[i].height arr1[i].widthx = 200 arr1[i].heightx = 350 arr1[i].flag = lca.flagx arr1[i].idx1 = i } }, function (res) { console.log('promiseerr') }) 整个过程中,读取图片大小和上传可以用 Promise对象,缩小图片因为要用画布组件而无法使用Promise。[END]
2020-12-28 - 开发工具下表单组件input编译后模拟显示异常这是什么原因?
编译后模拟器显示页面时,用鼠标点击input组件,无光标出现,但input的bindfocus事件有响应。也不是每次发生,但10次有5,6次。之前版本未出现此问题。开发工具版本:RC v1.03.2005141。
2020-05-27 - 小程序如何解绑?
场景 在日常开发中经常遇到以下问题, 1、离职了,微信号还被公司的小程序绑定为体验者或者运营者 2、甲方爸爸的项目交付了,微信号还被绑定为体验者或者运营者 遇到上述问题怎么办? 解决方案 关注公众平台安全助手(mphelper),点击菜单–>绑定查询->微信号绑定帐号,可以看到绑了哪些小程序,然后也可以直接进行解绑。 备注 特别注意:管理员无法解绑,只能登陆小程序后台进行换绑。建议联系原公司换绑管理员。 相关链接 https://developers.weixin.qq.com/community/develop/doc/000c0ad40f85e0961147c3c975b000?_at=1578280763953 https://developers.weixin.qq.com/community/develop/doc/00000450f605781be89868e3851000?_at=1578281244737
2020-01-06 - javascrip有json对象变成 连接字符串的函数吗?
{"aa":2,"bb":3} 变成aa=2&bb=3
2019-12-19 - 使用db.command.geoNear 报502001错?
想要查询附近一公里内的所有小区列表,在小区表里面建立了一个类型为geopoint的字段,为这个字段使用geoNear的条件查询,结果报了个502001错误,请问这时是为什么?代码如下: [图片] 错误代码如下:[图片] 数据库索引如下:[图片] 基础库为2.8.3 求原因~以及解决方法
2019-10-09 - 怎么捕获 InterstitialAd.load 报的 promise rejection 错误?
API:InterstitialAd.load [图片]
2020-01-04 - subscribeMessage.send 云开发调试,小程序端调用可行,其它云函数调用就报错求助?
API:subscribeMessage.send APPID:wx166797882f2ec0ce Request ID: 973fb524-2b0b-11ea-8ec5-525400e4521d Request ID:f4ebc274-2b07-11ea-8015-52540029942f Request ID: 723fb2fa-2b06-11ea-b0e0-5254007aa7a1 开发者工具版本:Nightly v1.02.1912272 订阅消息授权了很多次,不是次数用光的原因。 问题描述: 我参考官方给出的请求示例,准备先测试一下云函数的消息发送。 云端测试和本地调试中的从其它云函数调用,却都会提示:Error: errCode: -501007 invalid parameters | errMsg: subscribeMessage.send:fail Invalid request param 只有本地调试中的从小程序端调用,可以发送订阅消息。 参数我都写死了也不行。 也搜索了别人的问题,似乎和我的不一样,特来发帖求助! const cloud = require('wx-server-sdk') cloud.init() exports.main = async (event, context) => { try { const result = await cloud.openapi.subscribeMessage.send({ touser: "ob0Ed5Dp-zyIWESoVxk2zhec90cQ", templateId: "eOjW50z8-Wa5k3HrRpJoWFE7HKiMMogymBfhAgsvb3Q", page: "pages/home/home", data: { "thing1":{ "value":"苹果" }, "date3":{ "value":"2015年01月15日" } } }) console.log(result) return result } catch (err) { console.log(err) return err } } 日志内容 Request ID: 973fb524-2b0b-11ea-8ec5-525400e4521d 执行时间: 76.8ms内存使用: 35.45 MB 返回结果 {"errCode"-501007"errMsg""subscribeMessage.send:fail Invalid request param"} 日志 START RequestId: 973fb524-2b0b-11ea-8ec5-525400e4521d Event RequestId: 973fb524-2b0b-11ea-8ec5-525400e4521d 2019-12-30T13:5217.177Z { Error: errCode: -501007 invalid parameters | errMsg: subscribeMessage.send:fail Invalid request param at Object.callWXOpenAPI (/var/user/node_modules/wx-server-sdk/index.js:36319) at <anonymous> at process._tickCallback (internal/process/next_tick.js:188) errCode: -501007, errMsg: 'subscribeMessage.send:fail Invalid request param' } END RequestId: 973fb524-2b0b-11ea-8ec5-525400e4521d Report RequestId: 973fb524-2b0b-11ea-8ec5-525400e4521d Duration:76ms Memory:256MB MaxMemoryUsed:35.453125MB
2019-12-31 - 小程序富文本解析组件
很多项目中需要文档类型的输出,使用html或者wxml来输出显得很不方便,markdown的文档输出方式是开发人员的首选,由于微信小程序不能直接渲染HTML,因此富文本编辑器生成的HTML内容无法直接在小程序中展示。 [代码]queryUI[代码]内置支持markdown文档解析(支持table),html解析 [代码]ui-markit[代码]是[代码]queryUI[代码]文档的解析组件,如何在你的项目中使用呢,可以参考 https://gitee.com/webkixi/aotoo-xquery 的项目介绍 解析示例 小米官网的UI设计我挺喜欢的,随便找一个抄一下 [图片] 仿小米html源码 组件解析html结构并生成小程序结构 [代码]<div class="card-container"> <div class="for-img"> <img class="card-img" src="https://cdn.cnbj1.fds.api.mi-img.com/mi-mall/2c16238f786e4f93bdb175d7bf21aa47.jpg" /> </div> <h3 class="for-title" style="border: 1px solid red;"> Redmi K30 </h3> <p class="for-desc"> 120Hz流速屏,全速热爱 </p> <p class="for-price"> 1599元起 </p> </div> [代码] css stylus样式,需要编译生成wxss样式文件 [代码].card-it width 100% margin 0 auto background-color #f5f5f5 padding: 20px 0 .card-container position: relative; z-index: 1; width: 234px; height: 260px; margin 0 auto // margin-left: 14px; margin-bottom: 14px; background: #fff; padding: 20px 0; transition: all .2s linear; .for-img width: 160px; height: 160px; margin: 0 auto 18px; .card-img width: 160px; height: 160px; image width 160px height 160px .for-title display: block; font-size: 16px; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; font-weight: 400; text-align: center; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; margin: 0 10px 2px; .for-desc display: block; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; text-align: center; text-overflow: ellipsis; white-space: nowrap; overflow: hidden; margin: 0 10px 10px; height: 18px; font-size: 12px; color: #b0b0b0; .for-price display: block; margin-block-start: 1em; margin-block-end: 1em; margin-inline-start: 0px; margin-inline-end: 0px; text-align: center; color: #ff6700; margin: 0 10px 14px; [代码] 文档说明内容 [代码]## xquery富文本组件使用 富文本组件是xquery的内置组件,通过下面几个步骤安装使用 ... [代码] wxml [代码]<ui-markit dataSource="{{htmlConfig}}" textType="html" /> <ui-markit dataSource="{{mdConfig}}" textType="md" /> [代码] js [代码]const Pager = require('components/aotoo/core/index') Pager({ data: { htmlConfig: { listClass: 'html-class', // 容器样式类 content: `<div ...` }, mdConfig: { listClass: 'md-class', // 容器样式类 content: `markdown 内容部分` } } }) [代码] github地址:https://github.com/webkixi/aotoo-xquery 小程序demo演示 [图片]
2020-06-19 - 多形态小程序日历组件,轻松搞定项目需求
小程序日历组件 小程序日历组件,支持多种模式,简单易用好上手。 4种日历模式 3种日期选择方式 支持自定义节假日 支持自定义日期内容 懒加载保证渲染性能 支持农历 支持根据指定日期自动生成 支持跨无数据月份 [图片] [图片] [图片] [图片] [图片] 日历组件基础配置 wxml模板 [代码]<ui-calendar dataSource="{{config}}" /> [代码] 配置日历组件 [代码]Pager({ data: { source: { $$id: 'calendar', mode: 1, // 纵向日历 type: 'range', // 区域选择 tap: 'onTap', // page响应事件 total: 365, // 指定日历总天数 data: [], // 按给定日期计算total值,自动构建日历 rangeCount: 28, // 区选区间28天 rangeMode: 2, // 区选模式 rangeTip: ['入住', '离店'], // 区选提示 festival: true, // 开启节假日显示 alignMonth: false, // 月份对齐,swiper切换时 lunar: false, // 是否显示农历 date: [], // 指定日期显示的内容 value: ['2019-12-24', '2020-01-05'], // 默认值 toolbox: { monthHeader: true, // 是否显示月头 discontinue: false, // 自动构建时,是否省略无数据的月份 }, methods: { // 响应 tap事件 onTap(e, param, inst) { // param.date 选中的当前日期 // 当区选模式时 // param.range === 'start' 区选第一天 // param.range === 'end' 区选最后一天 } } } } }) [代码] github地址:https://github.com/webkixi/aotoo-xquery 小程序demo演示 [图片]
2020-06-30 - 将小程序原生异步函数promisify后,在async/await中使用
目前,小程序中支持使用async/await有三种模式: 1、不勾选es6转es5,不勾选增强编译;该模式是纯es7的async/await,需要基础库高版本。 2、勾选es6转es5,勾选增强编译;一般是因为调用了第三方的es5插件,通过增强编译支持async/await。 3、勾选es6转es5,不勾选增强编译;手工引入runtime.js支持async/await。 据最近更新情况,原生的函数已经大部分同时原生支持同步化了,不需要本方案转化了,直接加上await即可;比如wx.chooseImage、wx.showModal。。。具体有哪些,可以自己试。 如果只是wx.request的同步化,可参考: https://developers.weixin.qq.com/community/develop/article/doc/0004cc839407a069f77a416c056813 app.js代码: function promisify(api) { return (opt, ...arg) => { return new Promise((resolve, reject) => { api(Object.assign({}, opt, { success: resolve, fail: reject }), ...arg) }) } } App({ globalData: {}, chooseImage: promisify(wx.chooseImage), request: promisify(wx.request), getUserInfo: promisify(wx.getUserInfo), onLaunch: function () { }, }) 某page的index.js代码: const app = getApp() testAsync: async function(){ let res = await app.chooseImage() console.log(res) res = await app.request({url:'url',method:'POST',data:{x:0,y:1}}) console.log(res) }, [图片]
2020-10-20 - 微信小程序云开发按月份查找问题?
目前使用微信云开发,数据库也是云数据库,现在需要从数据库 生日表中 查询本月过生日的人员信息,之前用SQL时一般用[代码]select[代码] [代码]* [代码][代码]from[代码] [代码]student [代码][代码]where[代码] [代码]month[代码][代码](birthday)=[代码][代码]month[代码][代码](getdate()) 从student表中,直接将birthday字段格式化成month进行比对,小程序中试了不能用。请问有没有类似的方法??[代码] [代码][图片] [代码] [代码]数据库生日存的是date类型[代码] [代码] [代码] 有没人大神提个思路,我自己去查资料就行,自己想了好久,试了好多方法,百度也查不到,实在不行我只能在数据库里面加一个月份的字段,专门存月份,但是感觉好LOW,即然存了日期格式就应该可以取才对呀。
2019-12-16 - 如何用云开发创建专属文件存储小程序?丨实战
▌一、项目背景 学习云开发也有段时日了,当时就想试试手,不过一直没有灵感。直到有一次同学问我有没有老师发过的某个ppt,我说你怎么不去翻聊天记录呢?他说太麻烦,而且聊天记录中的文件可能会被清理。 当时就想到如果可以做个小型的文件存储小程序该多好,于是就下手了。往往需求决定产品这就没错了。下面继续介绍下小程序是如何实现的。 ▌二、项目简介 爱存储是一个可以将手机相册里的照片(或拍照的照片)和微信聊天会话里的文件(比如Doc、docx、xls、xlsx、ppt等文件)上传到云开发的存储里,并可以进行分享的小程序。 爱存储小程序使用的是小程序的云开发,云开发自带免费的云存储、云数据库,开始时不需要涉及服务器的搭建及运维,也不需要进行域名注册与备案,只需要通过一些简单的API就能实现一个完整项目的业务逻辑,免费而且无需后端,开发成本非常低,因此这个小程序从创建到发布都是免费的,非常适合新手。 [图片] [图片] ▌三、项目准备 在云数据库中创建diary、fileCountInfo集合,权限都是仅创建者可读写,在云存储中创建一个diary文件夹。 ▌四、功能介绍与项目的目标 下面将会围绕以下几个比较核心的功能进行分析。 首页弹窗倒计时: 该弹窗在用户使用小程序期间只会弹出一次。弹窗弹出时可以自动取消弹窗在这里是通过倒计时来关闭的当然也可以点击按钮取消,具体效果请亲自使用下小程序,下方是判断及添加缓存部分代码。 [代码]//判断是否添加了缓存 wx.getStorage({ key: 'time2', success: res => { this.setData({ instructions: false }) }, fail: err => { //添加缓存 wx.setStorage({ key: "time2", data: new Date().getTime(), success: res => { this.setData({ instructions: true }) var interval = setInterval(event => { var timeCount = this.data.timeCount this.setData({ timeCount: --timeCount }) }, 1000) //15秒后取消弹窗 setTimeout(res => { this.setData({ instructions: false }) clearInterval(interval); }, 15000) } }) } }) [代码] 限制每个用户只有100M存储空间,在云开发数据库中创建一个fileCountInfo集合(权限设置为仅创建者可读写),为每个用户添加一条记录字段有currentStorage(当前存储容量)和maxStorageCount(最大存储容量),这样就为以后的容量存储限制做了铺垫。下方是部分实现代码,逻辑还需要自己揣摩。 限制支持文件类型: doc、docx、xls、xlsx、ppt、pptx、pdf 在js里添加了一个数组变量fileFormat用来保存仅支持的文件类型,通过js代码判断用户选取的文件是否在这个数组里从而能否上传,当然判断用户是否能上传还有存储容量的限制,前面已经说了最大 100M,每次用户上传文件currentStorage字段都会增加用户上传的文件大小,具体实现看源代码上面都有注释。下方是部分代码用来实现是否是支持的文件类型。 [代码]for (var i = 0; i < res.tempFiles.length; i++) { var position = res.tempFiles[i].name.lastIndexOf('.'); var suffix = res.tempFiles[i].name.substring(position + 1); if (this.data.fileFormat.indexOf(suffix) < 0) { console.log("文件格式") this.setData({ canUpload: false, fileType: suffix }) console.log(this.data.fileType) break; } } [代码] 文件的上传及删除: 文件上传包括上传之前的判断是否符合要求,前面有提到过。还会涉及到一些坑一会再说。 其他小功能: 文件预览、文件的分享,文件的排序及下方存储容量的显示逻辑比较简单这部分比较简单大家看下源代码就可以了。 ▌五、遇到的困难 遇到的困难也就是在文件上传和删除那一块,就是我刚才说一会要解决的问题。在上传文件会涉及到单个文件或多个文件同时上传,是每个文件上传成功都要提示下成功上传提示呢?还是所选文件全部上传完才提示呢?如果是前者肯定会对用户不友好所以我选择了后者,但怎么才能让它们全部上传完才弹出上传成功提示呢,我试了很多方法比如加个flag标志等等,但都不能很好地解决问题。我静下心来再仔细想想,想到了以前使用的 promise 正好适合这个场景,所以使用了 promise 解决了该问题,这里遇到的问题和删除文件类似就不一一描述,相关代码可参见项目源码。 ▌六、总结 小程序较其他编程语言更容易上手,尤其使用了云开发自带免费的云存储、云数据库,让此项目更快的完成。相信通过学习此项目你已经可以开发自己的文件存储小程序了。 源码地址 https://tencentcloudbase.github.io/ 如果你想要了解更多关于云开发CloudBase相关的技术故事/技术实战经验,请扫码关注【腾讯云云开发】公众号~ [图片]
2019-12-06 - 云函数获取openid
代码如下: app.js: //如果担心openid的安全,就用这个函数 getCloudOpenid: async function () { return this.openid = this.openid || (await wx.cloud.callFunction({name: 'login'})).result.OPENID }, //最佳方案。 getOpenid: async function () { (this.openid = this.openid || wx.getStorageSync('openid')) || wx.setStorageSync('openid', await this.getCloudOpenid()) return this.openid }, 任何page: onLoad: async function () { console.log(this.openid = await getApp().getOpenid()) }, //在本page的其他函数里获得openid。 yourFunc: function(){ console.log(this.openid) } 云函数login: const cloud = require('wx-server-sdk') cloud.init() exports.main=async()=>{return cloud.getWXContext()}
2020-10-18 - 总结的一些血与泪的教训
云函数 云函数的上传流程 云函数必须先保存后上传,因为编译器不会在上传的时候自动保存。 保存的方法可以是CTRL+S或者是编译都可以,CTRL+SHIFT+S和编译是等效的;上传的方式可以是对文件的增量更新或者说部署云函数。主要是顺序必须先保存后上传。 云函数部署对于触发器并没有效果,触发器得单独上传(仍然需要先编译)。 如何知道云函数是否执行出错了 云开发→云函数→日志,读取日志,可以读取服务器返回的数据,所以云函数中最好用try{}catch(e){}结构,然后return JSON.stringify(e),当然你不这样也没问题,因为服务器会自动吧错误写进日志 云函数中console.log()的内容会写在日志的末尾。 当然,你也可以使用云函数的本地调试功能(来自Littlesnail大佬的分享),但是本地环境是缺少wx-server-sdk这个包的,需要自己用npm装,大家可以自行衡量。 如何知道云函数是否真正执行完了 之前一直在python平台的我根本没接触过node.js这种异步事件驱动的语言,被异步快整疯了 首先说结论,你得把所有返回Promise类型的方法都加上await关键字,并函数变为async类型。 所谓的Promise类型是指的一个虚的对象,他传递给某些函数后,对那些函数进行一个“保证”,保证过会会给那些函数数据。因此那些函数会先等着,等Promise返回数据后,提醒这些函数开始工作了,然后上一个工作完提醒下一个直到函数执行完。因为有些操作,比如数据库的读取是需要时间的,所以要是一直等着会阻塞整个线程。(node.js似乎是单线程的,这算是一直对多线程的补偿方案吧) Promise对象有三种状态。Pending,表示正在运行中;fulfilled,表示完成然后会自动提醒下一个函数;rejected,表示失败,当然如果你用try catch了就没事。 重点来了,对于async的云函数来说,执行到最后或者return就相当于结束了,然而这个时候如果函数内仍然有处于“保证中”(Pending)的Promise对象,云函数是不会等它执行完才返回的,它会直接返回。所以你必须加一个关键字,await,表示下面的语句都会等着这个异步操作完成再工作,也就是阻塞住。这样才能真正使得云函数完全执行完。 如何判断什么函数返回的是Promise对象,在开发者工具的console里面输入一下这个函数就行了,实在不行typeof。 PS:以前我曾经想过,如果吧云函数的async标签去掉,是否能实现不需要await也能正常运行呢,答案是,你想的美,去掉后人家该Promise还是Promise,不会给你变成现实(特朗普:恶意的zz隐喻,举报了)。所谓的async标签是指的我警告你我这玩意是异步的,你能用then,但是大多数情况你都不会去用then,所以,老老实实await吧。 你们就不要挣扎了,老老实实吧所有出现异步的位置都async和await吧 你标了async的函数,调用它的函数也得加async哦,而且调用的时候也得await 【async-await地狱】 小细节 云函数的运行环境中你不能获取到函数的信息,this.name,this.toString(),或者window.decodePathName都是undefine 数据库 为什么有时候数据库的get没用请确定你的权限是否有误,在 云开发控制台-数据库-权限设置 中可以调整,一般来说选第一个权限 为什么有时候数据库的update没用 首先当然是排查是不是因为在云函数中你却没有加await,数据库的几乎所有操作全是异步的,返回的基本都是Promise对象,另一点是小程序中的db.collection('seats')对象是动态对象,你不能这样写 db_seats=db.collection('seats') db_seats.where({}) 如果你在下面的语句继续用db_seats来直接对数据库做一些操作,相当于你创建了一个数据库的本地副本,你get()数据当然是有用的,但是可能不是最新的数据,但是你add()和update()都是没用的。你必须每次都用db.collection('xxx')来调用xxx数据库。 (实际上后来经过调查发现,add有时候是可以的,但是update保证每次都不行,不知道为啥) ————(以下为更新内容)———— 事实上还有一种更加广泛的错误 一定要注意,doc函数查到的是数据库的索引的_id字段,而不是_openid字段,你拿openid去doc一定找不到东西。 所以如果你一开始只有openid这个数据,那你最好先用where找到对应数据的_id,然后再doc它的id (为什么不直接where后接update?where返回的是一个数组,where接update相当于一次性修改一组数据,只有服务器端,也就是云函数有这个权限,小程序的前端只能先查询再修改) 数据库传入的数据 只有数据库的where(),update(),add(),传入的JSON数据中,只有data是必选属性,其他属性像是success,fail都是非必要的,如果你不用错误处理的话就不用加 then怎么用 数据库的then(),或者说所有的异步操作的then,你把函数放在then()里面表示到时间后完成某项操作,比如 //获取所有data const seats_list = await db.collection('seats').where({ used: true }) .get().then(res => { // return res.data console.log(res.data) }) 相当于吧收到的参数命名为res,然后等res异步返回后,会在=>{}里面处理一些只跟res有关的操作,这当然是有用的,但是问题在于then里面是一个闭包,你console.log当然是可以的,但是你要在里面用this.setData()就不行了,这个闭包的this可不是指的你这个外面的对象,他就是指的它点前面的对象,也就是get()后返回的对象。 所以想在外面用的话,正确操作是吧注释去掉,也就是return res或者return res.data,然后这样的话,外面的seats_list 就能被赋值为res或者res.data了,然后接下来的语句尽情对seats_list 操作,千万别忘了加await,否则你懂的。 WXML 为啥我的wx:if不管用 请注意一件事,那就是。。。WXML里面的任何函数部分,都是不能有空格的,比如这样写 点击选座位 点击选座位 点击选座位 点击选座位 点击选座位 无论你空格加在哪里,只要被""括起来,加空格都会使得wx:if失效,相信小伙伴们此时已经反应过来了,没错,这就是JS那个傻逼机制,非空字符串相当于true > Boolean(" ") > true 我猜wx:if的机制只是简单的做了下拆分,然后配对了下,并不能实际把它当程序运行(甚至可能正则都没用),所以如果遇到了它没拆成功的字符串,它就干脆暴力返回原字符串,当然被识别为true了。 整体 Js的所有变量都需要预先var数据库的Data和云函数的Data JS的Date()函数很迷,它返回的是tm一个String,当前时间的String,你必须用var new才能构造一个真正的Date对象而不是一个字符串,也就是按照下面方法使用,加注释的都是错误的用法。 var nowdate=new Date() // Date().getDate() // Date(一个Date对象).getDate() // Date(一个字符串).getDate() 另外就是无论你在哪调用这个函数,他创建的都是你调用端的时间,而不是云端的时间,就算你在云函数调用也一样,你电脑或者手机是几点他创建的就是几点,我都服了。 云端的时间只能用db.serverDate()来构建,但是问题在于db.serverDate()是tmd一个指令,他返回的不是一个Date,而是类似db.commend那种类型的东西,给传入服务器的data用。 //更新nowdate为服务器时间 await db.collection('seats').where().update({ data:{ nowdate:db.serverDate() } 也就是你平时用是没JB用的,你只能老老实实去用JS的Date方法请求世界时然后倒时区。 总结 以后想到了继续补充,欢迎大佬分享
2020-05-11 - crypto-js npm 包的使用问题?
npm install crypto-js --production 构建npm [图片] 使用: import hmacSHA512 from 'crypto-js/hmac-sha512';但是crypto-js目录只有一个index文件,所以只能用 var CryptoJS = require("crypto-js"); console.log(CryptoJS.HmacSHA512("Message", "Key")); 结果: [图片] [图片] 请告诉我解决办法
2019-09-26 - 微信小程序分页加载数据~上拉加载更多~小程序云数据库的分页加载
我们在开发小程序时,一个列表里难免会有很多条数据,比如我们一个列表有1000条数据,我们一下加载出来,而不做分页,将会严重影响性能。所以这一节,我们来讲讲小程序分页加载数据的实现。 老规矩,先看效果图 [图片] 可以看到我们每页显示10条数据,当滑动到底部时,会加载第二页的数据,再往下滑动,就加载第三页的数据。由于我们一共21条数据,所以第三页加载完以后,会有一个“已加载全部数据”的提示。 本节知识点 1,小程序分页加载 2,小程序列表显示 3,云数据库的使用 4,云数据库分页请求数据的实现 一,先定义数据 我们做分页数据加载,肯定要先准备好数据,数据已经给大家准备好,如下图,文章末尾会贴出数据源和本节课源码的下载地址。 [图片] 然后把数据导入到我们的云开发的数据库里,关于数据如何导入,这里不再讲解,不知道的同学,请看下面这篇文章。或者去老师历史文章里找一下。 《小程序云开发入门—云数据库数据源的导入与导出》 下面给大家看下我们的数据源,长什么样。其实很简单,就是简单的定义21条数据。 [图片] 然后在看导入到数据库的样子。 [图片] 二,分页请求数据 我们第一步准备好了数据以后,接下来就来讲讲如何在js里做分页加载数据。 首先我们这里用到了小程序云开发数据库的知识点 1,get方法:获取云数据库数据 2,skip方法:跳过前面几条数据,请求后面的数据 3,limit方法:请求多少条数据。 比如下面这段代码,就是跳过前5条,请求从第6条开始往后的10条数据,就是请求6~15的数据,我们做分页加载也就是基于这个原理。 [代码] wx.cloud.database().collection("list") .skip(5) //从第几个数据开始 .limit(10) [代码] 下面把我们index.js的完整代码贴给大家。 [代码]//老师微信:2501902696 let currentPage = 0 // 当前第几页,0代表第一页 let pageSize = 10 //每页显示多少数据 Page({ data: { dataList: [], //放置返回数据的数组 loadMore: false, //"上拉加载"的变量,默认false,隐藏 loadAll: false //“没有数据”的变量,默认false,隐藏 }, //页面显示的事件 onShow() { this.getData() }, //页面上拉触底事件的处理函数 onReachBottom: function() { console.log("上拉触底事件") let that = this if (!that.data.loadMore) { that.setData({ loadMore: true, //加载中 loadAll: false //是否加载完所有数据 }); //加载更多,这里做下延时加载 setTimeout(function() { that.getData() }, 2000) } }, //访问网络,请求数据 getData() { let that = this; //第一次加载数据 if (currentPage == 1) { this.setData({ loadMore: true, //把"上拉加载"的变量设为true,显示 loadAll: false //把“没有数据”设为false,隐藏 }) } //云数据的请求 wx.cloud.database().collection("list") .skip(currentPage * pageSize) //从第几个数据开始 .limit(pageSize) .get({ success(res) { if (res.data && res.data.length > 0) { console.log("请求成功", res.data) currentPage++ //把新请求到的数据添加到dataList里 let list = that.data.dataList.concat(res.data) that.setData({ dataList: list, //获取数据数组 loadMore: false //把"上拉加载"的变量设为false,显示 }); if (res.data.length < pageSize) { that.setData({ loadMore: false, //隐藏加载中。。 loadAll: true //所有数据都加载完了 }); } } else { that.setData({ loadAll: true, //把“没有数据”设为true,显示 loadMore: false //把"上拉加载"的变量设为false,隐藏 }); } }, fail(res) { console.log("请求失败", res) that.setData({ loadAll: false, loadMore: false }); } }) }, }) [代码] 上面的代码就是我们实现分页加载的所有逻辑代码。简单说下代码 1,我们首先进页面时会请求前10条内容 2,10条内容请求成功以后,我们会把请求到的内容加入dataList数组,然后把dataList里的数据显示到页面上。并将currentPage加一,用于请求第二页数据。 3,当用户滑动到底部时,会触发onReachBottom事件,在这个事件里做第二页到请求。然后第二页数据请求成功以后。继续将currentPage加1,这里要记住一定,一定要请求成功以后才将currentPage +1。 三,列表布局和样式 其实index.wxml和index.wxss的代码很简单,给大家把代码贴出来。 1,index.wxml [代码]<scroll-view scroll-y="true" bindscrolltolower="searchScrollLower"> <view class="result-item" wx:for="{{dataList}}" wx:key="item"> <text class="title">{{item.content}}</text> </view> <view class="loading" hidden="{{!loadMore}}">正在载入更多...</view> <view class="loading" hidden="{{!loadAll}}">已加载全部</view> </scroll-view> [代码] 2,index.wxss [代码]page { display: flex; flex-direction: column; height: 100%; } .result-item { display: flex; flex-direction: column; padding: 20rpx 0 20rpx 110rpx; overflow: hidden; border-bottom: 2rpx solid #e5e5e5; } .title { height: 110rpx; } .loading { position: relative; bottom: 5rpx; padding: 10rpx; text-align: center; } [代码] 到这里我们就完整的实现里分页加载功能了。 [图片] 源码和数据源,已经给大家放到网盘里了,有需要的同学请在文章底部留言,或者私信老师。 视频讲解:https://edu.csdn.net/course/detail/9604
2019-11-07 - 在app.js设置globalData openid,在其他页面取不到值?
app.js [图片] imagelist.js [图片] 能取到test的值 但是不能取到userid的值 输出上又有??昨回事
2019-08-23 - 在一个页面page的哪个生命周期函数中执行 setData 是较好的时机?
一个页面page的数据对象data里的各个变量,在多数时候是动态的。比如在页面加载过程来给这些变量赋值:setData。那么页面加载过程有多个生命周期函数lifeCycleMethod function,如 onLoad,onReady, onShow, etc. 在哪个函数中执行 setData 是较好的时机?
2019-08-29 - 什么时候能解决云开发使用uploadFile HTTPAPI上传文件后不可用
使用云开发,在自己的服务器管理微信云端的小程序数据,实现ServerLess的小程序服务。 在这个项目进行到测试阶段,发现了API的BUG问题,使用云开发HTTP API上传文件到微信小程序云存储,在小程序中使用 image src=cloud://xxxxfileID,控制台显示报错,不知道是什么原因。 按文档说明,使用的API是: POST /tcb/uploadfile?access_token={token}该调用成功后会返回一些重要参数,在之后还需要使用这些参数再次调用接口,完成将文件上传到腾讯云。 下面是一段Java代码,实现按参数返回的接口地址和其他参数,调用上传文件。 [代码]String fileName2 = Optional.of(fileName).orElse(file.getName());[代码][代码]MultipartBody requestBody = [代码][代码]new[代码] [代码]MultipartBody.Builder()[代码][代码] [代码][代码].addFormDataPart([代码][代码]"key"[代码][代码], path)[代码][代码] [代码][代码].addFormDataPart([代码][代码]"Signature"[代码][代码], authorization)[代码][代码] [代码][代码].addFormDataPart([代码][代码]"x-cos-security-token"[代码][代码], token)[代码][代码] [代码][代码].addFormDataPart([代码][代码]"x-cos-meta-fileid"[代码][代码], cosFileId)[代码][代码] [代码][代码].addFormDataPart([代码][代码]"file"[代码][代码], fileName2, RequestBody.create(MultipartBody.FORM, file))[代码][代码] [代码][代码].build();[代码][代码]Request request = [代码][代码]new[代码] [代码]Request.Builder()[代码][代码] [代码][代码].url(url)[代码][代码] [代码][代码].post(requestBody)[代码][代码] [代码][代码].build();[代码][代码]try[代码] [代码](Response response = okHttpClient.newCall(request).execute()) {[代码][代码] [代码][代码]return[代码] [代码]response.body().string();[代码][代码]} [代码][代码]catch[代码] [代码](IOException e) {[代码][代码] [代码][代码]Integer code = [代码][代码]1[代码][代码];[代码][代码] [代码][代码]String codeString = [代码][代码]"Call failure:"[代码] [代码]+ e.getClass().getSimpleName();[代码][代码] [代码][代码]String errorMessage = e.getMessage();[代码][代码] [代码][代码]throw[代码] [代码]new[代码] [代码]WeChatCloudAPICallFailException(code, codeString, errorMessage);[代码][代码]}[代码]在这一步,调用也成功,然后在微信开发者工具也能看到已上传的文件和文件夹。 但是,这个文件夹显示有点奇怪,还带了冒号,请看图: [图片] [图片] 上面显示的FileID也是比较奇怪,与调用 HTTP API 上传文件得到的FileID不一样, HTTP API给我返回的值是cloud://test-p73gd.7465-test-p73gd-1259274660/upload_201907/MPCCb0a66c6ee1d7420f94aabb6d5bdcc925.png 如果是直接用小程序 wx.cloud.uploadFile 上传文件,那上传的文件夹不会出现这种奇怪的情况,而且文件fileID是正常可用的。 所以这个应该是云HTTP API的BUG。 遇到这个问题已经快一个月了,之前也有提过,很着急等着,麻烦官方反馈一下,不胜感激!
2019-07-26 - 请问一个微信服务端 HTTP API uploadFile 的参数问题
uploadFile 官方文档地址 https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/storage/uploadFile.html 请求数据示例[代码]{[代码][代码] [代码][代码]"env"[代码][代码]: [代码][代码]"test2-4a89da"[代码][代码],[代码][代码] [代码][代码]"path"[代码][代码]: [代码][代码]"this/is/a/example/file.path"[代码][代码]}[代码] 可能是文档这个地方写的不是特别清楚,我一直不能很好理解 path 到底是一个目录还是文件(完整路径)! 反复调试,一直都没解决。 如果 path 传入参数 "test_files/1.jpg" 则调用返回失败:errCode:-503002 errMsg:不具备访问权限 hint: [4A9CGA01882162] 如果 path 传入参数 "test_files/" 同样调用返回失败:errCode:-503002; errMsg:不具备访问权限 hint: [PQXICa03642028] 如果 path 传入参数 "test_files" 还是调用返回失败:errCode:-503002; errMsg:不具备访问权限 hint: [riNuSa05592162] 然后 path 不管你传入 "/test_files" 还是 "/test_files/" 都是一样返回失败: errCode:-503001; errMsg:Invalid path: "/test_files" hint: [4Cl.ea04302028] errCode:-503001; errMsg:Invalid path: "/test_files/" hint: [6KM9oa05322028] 以为是path写的目录要手工建立,我就在微信IDE里面的云开发窗口下面,云存储里面新建了文件夹test_files,问题都一直没有解决。 实在是没办法理解这个参数,也找不到相关的帖子,在此希望知道的朋友指导一下为什么。 谢谢
2019-06-22 - 有哪些好的办法用来在本地妥善保存小程序id等敏感信息?
小程序云开发中的 http api 接口,为第三方访问云端资源提供途径。比如有大量数据需要准备,仅通过小程序运行是难以实现的。 通过 http api 接口,可以在 PC 端访问云端数据库,从而能快速更新数据。 使用该接口需要先获得一个 accesstoken 字串,而获得此字串要先提供小程序id及其密令。 所以在使用该接口时有几个敏感的字串信息需要妥善保存在本地以供使用。问题:有哪些好的办法来保存这些字串信息?
2019-08-20 - setData 在模拟器测试时有效,真机调试时失效。这是什么原因?
setData 在模拟器测试时有效,真机调试时失效,手机上的界面不更新。不知道是什么原因。代码不复杂: <!-- testproc.wxml --> <view> <button bindtap="ontheclick">test</button> <view>{{lca}}</view> </view> <!-- testproc.js --> Page({ data: {lca: ''}, ontheclick: function () { this.setData({lca: 'abc'}) } })
2019-08-13