- 云开发数据库查询条件where中_.in以数组为查询关键字后,不能模糊查询?
使用_.in 以数组中的所有字段为关键字,对数据库进行查询,但是不能使用正则表达式进行模糊查询,尝试通过for循环,将数组中的每一个字段单独模糊查询后,再将每一次查询结果进行拼接汇总后输出,但是又遇到for循环里有向数据库发起查询请求的异步申请,而导致最后的查询返回结果的数组拼接有问题。请教各位大神,应该怎么解决这个问题啊? for (let index = 0; index < resKeyWord.length; index++) { console.log('当前的keyWord是:',resKeyWord[index]) const legalTerms = db.collection('legalTerms').where({ keyWord:{ $regex:'.*'+ resKeyWord[index], $options: 'i' } }).orderBy('checkNO', 'desc') .get({ success(res) { console.log('当前数组查询的返回值是:',res.data) oldTest = oldTest.concat(res.data) console.log('oldTest:',oldTest) } }) } console.log('oldTest:',oldTest) 最后一行打印出的oldTest是空的,意味着for循环还没有执行完,就执行了最后一行的打印了,尝试了各种方法,都解决不了,感谢各位支招。 或者有没有什么方法直接支持对resKeyWord这个数组对每一个字段进行模糊查询?
2023-04-03 - 云函数调用“office-to-pdf”库,本地调试成功,但真机调试失败?
云函数调用“office-to-pdf”库,将word的buffer转换成PDF文件,本地调试成功,但真机调试失败,真机调试因为不能看到云函数的本地调试打印,只能看到真机调试时的打印报错如下: message: "errCode: -401003 api parameter type error | errMsg: parameter.fileID should be string instead of undefined;", errCode: -401003, errMsg: "parameter.fileID should be string instead of undefined;", requestID: , line: 1, …} 调用云函数的js片段如下: imageToDocx(){ wx.showLoading({ title: '加载中', }) wx.cloud.callFunction({ // 云函数名称 name: 'imageToDocx', // 传给云函数的参数 data: { downloadFileID: this.data.downloadFileID, //CDN当事人签字图片 signPathLitigantURL: wx.cloud.CDN({ type: 'filePath', filePath: this.data.signPathLitigant, // 临时文件的路径 }), //CDN执法人员签字图片 signPathOfficersURL: wx.cloud.CDN({ type: 'filePath', filePath: this.data.signPathOfficers, // 临时文件的路径 }), sealURL: this.data.sealURL }, }) .then(res => { console.log('云存储文件的ID是:',res) wx.cloud.downloadFile({ fileID: res.result.fileID, success: res => { // 返回并存储临时文件路径 console.log('下载PDF路径:',res.tempFilePath) this.setData({ exportTempFilePath: res.tempFilePath }) wx.openDocument({ filePath: res.tempFilePath, showMenu: 'true', success: function (res) { console.log('打开文档成功') wx.hideLoading() } }) }, fail: console.error }) }) .catch(res=> { console.log('执行出错:',res) wx.hideLoading() if (this.data.previewTempFilePath=='') { var showModalContent = '未生成预览文书' } else { if (typeof(this.data.signPathLitigant)=='undefined' || typeof(this.data.signPathOfficers)=='undefined') { var showModalContent = '未生成手写签名' } else { var showModalContent = '未知错误' } } console.log(showModalContent) wx.showModal({ title: '导出失败', showCancel: false, content: showModalContent, success (res) { } }) }) }, 这里再把云函数的代码粘贴如下: // 云函数入口文件 const cloud = require('wx-server-sdk') const { createReport } = require('docx-templates') const fs = require('fs') const path = require('path') const dayjs = require('dayjs') const axios = require("axios") const toPdf = require('office-to-pdf') cloud.init({ env: 'cloud1-7g1pdoii23b288bf' }) // 云函数入口函数 exports.main = async (event, context) => { console.log(event) const res = await cloud.downloadFile({ fileID: event.downloadFileID, }) const template = res.fileContent console.log('当前下载读取文件成功') //导入当事人签字图片并转码 let signBuffer1 = await axios({ method: 'get', url: event.signPathLitigantURL, responseType: 'arraybuffer', }) const signPathLitigant64 = new Buffer.from(signBuffer1.data, 'binary').toString('base64') //导入执法人员签字图片并转码 let signBuffer2 = await axios({ method: 'get', url: event.signPathOfficersURL, responseType: 'arraybuffer', headers: { "Content-Type": "*" } }) const signPathOfficer64 = new Buffer.from(signBuffer2.data, 'binary').toString('base64') //导入印章图片并转码 let signBuffer3 = await axios({ method: 'get', url: event.sealURL, responseType: 'arraybuffer', headers: { "Content-Type": "*" } }) const seal64 = new Buffer.from(signBuffer3.data, 'binary').toString('base64') //开始编译插入 const wordBuffer = await createReport({ template, data: { //变量 }, additionalJsContext: { getMapPicture1: async () => { const res = signPathLitigant64; return { width: 3, height: 1.6875, data: res, extension: '.png', layout: 'Text wrapping' }; }, getMapPicture2: async () => { const res = signPathOfficer64; return { width: 3, height: 1.6875, data: res, extension: '.png' }; }, getMapPicture3: async () => { const res = seal64; return { width: 4, height: 4, data: res, extension: '.png', layout: 'Text wrapping' }; }, }, cmdDelimiter: ['+', '+'] //以+作为变量分隔符 }) const preDir = dayjs().format("YYYYMMDD");//日期 console.log('当前的日期是',preDir) const stringRandom = require('string-random') const randfilename = stringRandom(32)//随机文件名 const cloudPath = `${preDir}/${randfilename}.pdf`//文件 console.log('当前云路径是',cloudPath) //开始生成PDF文件 try { const pdfBuffer = await toPdf(wordBuffer) console.log('PDF生成成功') //上传云存储 return await cloud.uploadFile({ cloudPath: cloudPath, fileContent: Buffer.from(pdfBuffer, 'base64') }) } catch (error) { return error } } 我的分析是因为云函数中间发生问题,导致没有返回云存储的PDF文件的fileID,所以这样报错,但是因为真机调试时看不到云函数执行中的打印,所以确实找不到问题在哪里,请各位大神指点,在线等,感谢!!!
2022-11-23 - 小程序怎么实现word转PDF?
请教各位大神,小程序怎么在云函数中实现word转pdf? 我尝试用了libreoffice-convert这个库,但是总是有问题,又不知道问题在哪里,把代码贴出来,请各位指教。 或者还有没有其他的方法啊? 感谢各位指点! // 云函数入口文件 const cloud = require('wx-server-sdk') const { createReport } = require('docx-templates') const fs = require('fs') const path = require('path') const dayjs = require('dayjs') const axios = require("axios") const libre = require('libreoffice-convert') libre.convertAsync = require('util').promisify(libre.convert) cloud.init({ env: 'cloud1-7g1pdoii23b288bf' }) // 云函数入口函数 exports.main = async (event, context) => { console.log(event) const res = await cloud.downloadFile({ fileID: event.downloadFileID, }) const template = res.fileContent console.log('当前下载读取文件成功') //导入当事人签字图片并转码 let signBuffer1 = await axios({ method: 'get', url: event.signPathLitigantURL, responseType: 'arraybuffer', }) const signPathLitigant64 = new Buffer.from(signBuffer1.data, 'binary').toString('base64') //导入执法人员签字图片并转码 let signBuffer2 = await axios({ method: 'get', url: event.signPathOfficersURL, responseType: 'arraybuffer', headers: { "Content-Type": "*" } }) const signPathOfficer64 = new Buffer.from(signBuffer2.data, 'binary').toString('base64') //导入印章图片并转码 let signBuffer3 = await axios({ method: 'get', url: event.sealURL, responseType: 'arraybuffer', headers: { "Content-Type": "*" } }) const seal64 = new Buffer.from(signBuffer3.data, 'binary').toString('base64') //开始编译插入 const buffer = await createReport({ template, data: { //变量 }, additionalJsContext: { getMapPicture1: async () => { const res = signPathLitigant64; return { width: 3, height: 1.6875, data: res, extension: '.png' }; }, getMapPicture2: async () => { const res = signPathOfficer64; return { width: 3, height: 1.6875, data: res, extension: '.png' }; }, getMapPicture3: async () => { const res = seal64; return { width: 4, height: 4, data: res, extension: '.png' }; }, }, cmdDelimiter: ['+', '+'] //以{}作为变量分隔符 }) //开始转换PDF const ext = '.pdf' const pdfBuf = await libre.convertAsync(buffer, ext, undefined); console.log('pdfBuf:',pdfBuf) const preDir = dayjs().format("YYYYMMDD");//日期 console.log('当前的日期是',preDir) const stringRandom = require('string-random') const randfilename = stringRandom(32)//随机文件名 const cloudPath = `${preDir}/${randfilename}.pdf`//文件 console.log('当前云路径是',cloudPath) return await cloud.uploadFile({ cloudPath: cloudPath, fileContent: pdfBuf }) }
2022-11-21 - 云函数安装部署canvas后,运行报错canvas.node: invalid ELF heade?
云函数安装部署完canvas 安装没有发生问题,一切正常 [图片] 但是调用云函数后,一直报错,错误代码如下: [图片] 实在不知道怎么办了,请各位大神指点!!!!感激不尽! 同时提供云函数的源码,源码其实不完整,主要是想运行看看,不知道是源码的问题,还是canvas包安装的问题? // 云函数入口文件 const cloud = require('wx-server-sdk') const { createCanvas, loadImage } = require('canvas') cloud.init({ env: 'cloud1-7g1pdoii23b288bf' }) // 云函数入口函数 exports.main = async (event, context) => { console.log(event) //开始绘制-------------------------------------------------------------------- const canvas = createCanvas(400, 400) const ctx = canvas.getContext('2d') // Canvas 画布的实际绘制宽高 const renderWidth = 400 const renderHeight = 400 // 绘制前清空画布 ctx.clearRect(0, 0, renderWidth, renderHeight) // 绘制印章边框 var width = renderWidth/2 var height = renderHeight/2 console.log('width:',width) console.log('height:',height) ctx.lineWidth=2 ctx.strokeStyle="#f00" ctx.arc(width,height,78,0,Math.PI*2); ctx.stroke() //画五角星 create5star(ctx,width,height,25,"#f00",0); // 绘制印章单位 var company = event.seal console.log('company:',company) ctx.translate(width,height);// 平移到此位置, ctx.font = '20px NSimSun' ctx.fillStyle="#f00"; var count = company.length;// 字数 console.log('字数:',count) var angle = 4*Math.PI/(3*(count - 1));// 字间角度 var chars = company.split(""); var c; // ctx.transform(1,0,0,0,0,0) for (var i = 0; i < count; i++){ c = chars[i];// 需要绘制的字符 if(i==0) ctx.rotate(5*Math.PI/6); else ctx.rotate(angle); ctx.save(); ctx.translate(60, 0);// 平移到此位置,此时字和x轴垂直 ctx.rotate(Math.PI/2);// 旋转90度,让字平行于x轴 ctx.fillText(c,-10, 5);// 此点为字的中心点 ctx.restore(); } console.log('绘制结束') //绘制五角星 function create5star(ctx,sx,sy,radius,color,rotato){ ctx.save(); ctx.fillStyle=color; ctx.translate(sx,sy);//移动坐标原点 ctx.rotate(Math.PI+rotato);//旋转 ctx.beginPath();//创建路径 var x = Math.sin(0); var y= Math.cos(0); var dig = Math.PI/5 *4; for(var i = 0;i< 5;i++){//画五角星的五条边 var x = Math.sin(i*dig); var y = Math.cos(i*dig); ctx.lineTo(x*radius,y*radius); } ctx.closePath(); ctx.stroke(); ctx.fill(); ctx.restore(); } //绘制结束------------------------------------------------- return { } }
2022-09-29 - 小程序中如何根据输入的文字内容生成一个印章图片?
请问各位老师,如何在小程序中根据输入的文字内容生成一个印章的图片,是不是用canvas?具体怎么写程序,我看了开放文档也不晓得怎么操作啊?
2022-09-28 - 云开发数据库中内容管理(CMS)有2个数据一直排在最前?
云开发数据库开通了内容管理,内容集合按照添加时间排序,但是发现有2个记录一直自动排在最前,尽管添加时间是在后面去了,就算有新添加的依然排在最前,就像被无形置顶了一样,请问这种情况怎么办?
2022-03-15 - wx.cloud.downloadFile从云存储下载文件文件名不一致的问题?
用wx.cloud.downloadFile从云存储下载文件,但是下载并打开后都是一个临时文件的文件名,跟原来在云存储的文件名不一致,想让下载并打开的文件和原云存储的文件名保持一致,请各位老师赐教,感谢!! 附下载文件并打开的代码,仅用于打开云存储中的word文件 wx.cloud.downloadFile({ fileID: res.result.fileID, success: res => { // 返回临时文件路径 console.log('临时文件的路径是:',res.tempFilePath) wx.openDocument({ filePath: res.tempFilePath, showMenu: 'true', success: function (res) { console.log('打开文档成功') wx.hideLoading() } }) }, fail: console.error })
2022-01-26 - wx:for使用的问题,渲染不出?
使用wx:for渲染一直不成功,不知道什么原因,请各位老师指点,感谢!!!! <block wx:for="{{coercive}}" wx:key="key"> <!-- idx:"",name:"",model:"",unit:"",quantity:"",remark: --> <view class="section__title">编号:{{item.idx}}</view> <view class="section__title">标称名称/场所:{{item.name}}</view> <view class="section__title">规格(型号)/场所地址:{{item.model}}</view> <view class="section__title">单位:{{item.unit}}</view> <view class="section__title">数量:{{item.quantity}}</view> <view class="section__title">备注:{{item.remark}}</view> </block> coercive数组的内容如下:coercive: Array(2) 0: {idx: "", name: "", model: "阿斯蒂芬", unit: "阿斯蒂芬斯蒂芬", quantity: "阿斯蒂芬", …} 1: {name: "撒旦法", model: "撒旦法", unit: "撒旦法", quantity: "撒旦法", remark: "", …}
2022-01-26 - 为什么小程序自带的ocr插件识别营业执照识别不了?
小程序中引用了自带的ocr 识别营业执照 的插件, 但是识别的时候只能通过拍照后识别照片,不能直接,如果直接识别的话,总是失败。 这个是bug 吗?
2022-01-18 - 一个form表单突然不能点击提交了,但手机预览又可以?
一个页面的form表单,之前还好好的,填加了一些内容后,突然点击提交按钮不起作用了,也不报错,就是点击提交按钮没有任何反应,将整个formSumbit()注释点,从新写一个最简单formSumbit()就是console一下提交内容,依然没有反应。一开始我以为是页面哪里错了,反复了看了反复编译执行,系统也没有报错,也没有错,就是点击提交按钮,没有任何反应。 但是最奇怪的是,不管是手机预览,还是真机调试,在手机上点击提交按钮都能正常提交,这是为什么呢?如果开发真工具点击没有反应,为什么手机预览又可以正常运行,这样我在电脑上就没法调试了! 请各位老师指点!!谢谢! 不好意思,没有上代码,我把全部这个页面的代码上传如下,请老师指点: // pages/dangchu/dangchu.js import WxValidate from '../../utils/WxValidate.js'; const db = wx.cloud.database() Page({ /** * 页面的初始数据 */ data: { punishment_date: '2022-01-01', date: { year: '', month: '', day: '' }, certificateID1: '', certificateID2: '', // 模糊查询时长 timer: 0, // 点击结果项之后替换到文本框的值 inputValue: '', // 是否隐藏模糊查询的面板 hideScroll: true, // 模糊查询结果 searchTip: [] }, onInput(e) { const inputValue = e.detail.value clearTimeout(this.data.timer) let timer = setTimeout(() => { if (inputValue) { // 如果输入的关键字不为空,则发起请求获取联想值 var that = this; //这句不能少,在查询时 const legalTerms = db.collection('legalTerms').where({ behavior:{ $regex:'.*'+ inputValue, $options: 'i' } }).get({ success(res) { console.log('查询成功', res.data); //将查询返回的结果赋值给本地变量 that.setData({ searchTip: res.data, inputValue: inputValue, hideScroll: false }) console.log('查询成功', that.data.searchTip); }, fail: err => { console.log('失败') } }) } // 如果为空,则收起 this.setData({ searchTip: [], hideScroll: true, // inputValue: '' }) }, 600) this.data.timer = timer }, itemtap(e) { const { info } = e.currentTarget.dataset console.log('选择的ID是',info) this.setData({ // 将点击选择的值展示在input框中 inputValue: info.behavior, illegalLawName: info.illegalLawName, illegalTitle: info.illegalTitle, punishLawName: info.punishLawName, punishTitle: info.punishTitle, // 当用户选择某个联想词,隐藏下拉列表 hideScroll: true }) }, showToast(error) { wx.showToast({ title: error.msg, icon: 'none' }) }, initValidate() { const rules = { officers_name1: { required: true }, officers_name2: { required: true, }, document_number: { required: true, }, } const messages = { officers_name1: { required: '请输入执法人员姓名', }, officers_name2: { required: '请输入执法人员姓名', }, document_number: { required: '请输入文书编号', }, // boxType: { // required: '请选择箱型', // }, // boxCount: { // required: '请输入发单数量', // intType: '发单数量请输入10以内' // }, // weight: { // required: '请输入箱重', // weight: '箱重请填写100以内整数或两位小数' // }, // store: { // required: '请输入门点地址', // }, // harbour: { // required: '请输入港区', // }, // freight: { // required: '请输入运费金额', // money: '请输入正确的金额' // }, // freshInterval: { // required: '请选择重发间隔', // }, // linkman: { // required: '请选择联系人', } this.WxValidate = new WxValidate(rules, messages) }, bindDateChange: function (e) { console.log('picker发送选择改变,携带值为', e.detail) this.setData({ punishment_date: e.detail.value }) }, // formSubmit(e) { // console.log('form发生了submit事件,携带数据为:', e.detail.value) // }, formSubmit(e) { var that = this console.log('form发生了submit事件,携带数据为:', e.detail.value) const params = e.detail.value // 校验表单 if (!this.WxValidate.checkForm(params)) { console.log(this.WxValidate.errorList[0]) const error = this.WxValidate.errorList[0] this.showToast(error) return false } var date = new Date(e.detail.value.punishment_date) var year = date.getFullYear() var month = date.getMonth()+1 var day = date.getDate() this.setData({ date: { year: year, month: month, day: day } }) const certificate1 = db.collection('certificate').where({ name: e.detail.value.officers_name1 }) .get().then(res=>{ this.setData({ certificateID1: res.data[0].certificateID }) console.log('当前数据库返回的是:',res.data[0].certificateID) const certificate2 = db.collection('certificate').where({ name: e.detail.value.officers_name2 }) .get().then(res=>{ this.setData({ certificateID2: res.data[0].certificateID }) console.log('当前数据库返回的是:',res.data[0].certificateID) wx.setStorageSync('dangchu_result',{ business_address: e.detail.value.business_address, enterprise_name: e.detail.value.enterprise_name, idCardNO: e.detail.value.idCardNO, person_name: e.detail.value.person_name, punishment_address: e.detail.value.punishment_address, reg_num: e.detail.value.reg_num, telNO: e.detail.value.telNO, officers_name1: e.detail.value.officers_name1, officers_name2: e.detail.value.officers_name2, illegal_behavior: e.detail.value.illegal_behavior, document_number: e.detail.value.document_number, punishment_day: that.data.date.day, punishment_month: that.data.date.month, punishment_year: that.data.date.year, certificateID1: that.data.certificateID1, certificateID2: that.data.certificateID2, illegalLawName: that.data.illegalLawName, illegalTitle: that.data.illegalTitle, punishLawName: that.data.punishLawName, punishTitle: that.data.punishTitle, }) wx.navigateTo({ url: '../handWrite/handWrite', }) }) .catch(res=>{ // 处理执法人员2输入错误 console.log('发生错误!', res), wx.showToast({ title: '输入的执法人员2不存在', icon: 'none' }) }) }) .catch(res=>{ // 处理执法人员1输入错误 console.log('发生错误!', res), wx.showToast({ title: '输入的执法人员1不存在', icon: 'none' }) }) }, getStorage(){ // var that=this var business= wx.getStorageSync('business') var idCard= wx.getStorageSync('idCard') this.setData({ enterprise_name: business.enterprise_name, reg_num: business.reg_num, business_address: business.business_address, person_name: business.person_name, idCardNO: idCard.idCardNO, }) }, /** * 生命周期函数--监听页面加载 */ onLoad: function (options) { this.initValidate() }, /** * 生命周期函数--监听页面初次渲染完成 */ onReady: function () { }, /** * 生命周期函数--监听页面显示 */ onShow: function () { this.getStorage() }, /** * 生命周期函数--监听页面隐藏 */ onHide: function () { }, /** * 生命周期函数--监听页面卸载 */ onUnload: function () { }, /** * 页面相关事件处理函数--监听用户下拉动作 */ onPullDownRefresh: function () { }, /** * 页面上拉触底事件的处理函数 */ onReachBottom: function () { }, /** * 用户点击右上角分享 */ onShareAppMessage: function () { } }) <!--pages/dangchu/dangchu.wxml--> <form bindsubmit="formSubmit" bindreset="formReset"> <view class="chapter"> <view class="chapter__title">当事人基本信息</view> <view class="section"> <view class="section__title">请输入当事人名称</view> <input class="ordinaryInput" name="enterprise_name" focus="true" value="{{enterprise_name}}"/> </view> <view class="section"> <view class="section__title">请输入统一社会信用代码</view> <input class="ordinaryInput" name="reg_num" value="{{reg_num}}"/> </view> <view class="section"> <view class="section__title">请输入住所地址</view> <input class="ordinaryInput" name="business_address" value="{{business_address}}"/> </view> <view class="section"> <view class="section__title">请输入法定代表人姓名</view> <input class="ordinaryInput" name="person_name" value="{{person_name}}"/> </view> <view class="section"> <view class="section__title">请输入法人身份证号</view> <input class="ordinaryInput" name="idCardNO" type="idcard" value="{{idCardNO}}"/> </view> <view class="section"> <view class="section__title">请输入法人联系电话</view> <input class="ordinaryInput" name="telNO" type="number"/> </view> </view> <view class="chapter"> <view class="chapter__title">处罚基本信息</view> <view class="section"> <view class="section__title">请输入文书编号</view> <input class="ordinaryInput" name="document_number" type="number"/> </view> <view class="section_two"> <view class="section__title">请输入执法人员姓名</view> <view class="twoInputBox"> <input class="twoInput" name="officers_name1" /> <input class="twoInput" name="officers_name2" /> </view> </view> <view class="section" style="clear: both;"> <view class="section__title">请输入处罚地点</view> <input class="ordinaryInput" name="punishment_address" value="{{business_address}}"/> </view> <view class="section"> <view class="section__title">请选择当前日期</view> <picker name="punishment_date" mode="date" start="2015-09-01" end="2025-12-01" bindchange="bindDateChange"> <view class="picker"> {{punishment_date}} <view class='arrow'></view> </view> </picker> </view> <view class="section"> <view class="section__title">请输入违法行为</view> <input class="ordinaryInput" name="illegal_behavior" value="{{inputValue}}" focus='true' confirm-type="search" placeholder="请输入违法行为的主要关键字" bindinput="onInput" /> <view class="line"></view> <scroll-view scroll-y="true" class="search-res" hidden="{{hideScroll}}"> <view class="sum">共找到和“{{inputValue}}”相关的结果{{searchTip.length}}个</view> <block wx:for="{{searchTip}}" wx:key="_id"> <view class="tip-item" bindtap="itemtap" data-info="{{item}}"> <view class="left"> <view class="tip"> <view>{{item.illegalLawName}}</view> <view>{{item.illegalTitle}}</view> </view> <view class="content"> {{item.illegalContent}} </view> </view> </view> </block> </scroll-view> </view> </view> <button formType="submit" class="End_button" type="primary">提交</button> </form> <view class="line"></view>
2022-01-16