腾讯云函数api开发 腾讯云api

云开发中的战斗机 Laf,让你像写博客一样写代码

各位云原生开发者与PPT架构师,是否曾梦想过能像撰写文章那样轻松编写代码?

如何才能像撰写文章一般编写代码?理想的需求是在线编写与调试函数,无需重启服务,随时查看函数运行日志,无需连接服务器,无需操作数据库、对象存储、Nginx等,能够随时上线应用,随需而至,随需而去,轻松发布!

懂王出现了,他指出这便是Serverless的理念,Serverless旨在用户只需关注开发意图,编写函数代码,并上传至代码仓库,其余资源由Serverless平台自动分配与管理。

虽然你懂得很多,但仅有Serverless还不够满足上述需求。

若要像撰写文章一样编写代码,除了Serverless提供函数计算服务外,还需要以下几个条件:

懂王再次出现,他指出腾讯云开发、Google Firebase以及UniCloud等平台也提供类似功能。

若你得知有一个平台已具备上述所有条件,且完全开源,每个开发团队都能轻松拥有自己的云开发平台,你会不会感到欣喜?是的,这个平台就是Laf。

无论是前端、后端、云开发用户、独立开发者、初创团队,还是我本人,都在使用Laf。请访问链接了解更多。

值得注意的是,Laf在上周五一天内Star数量增长了近300个,并连续几天呈垂直上升趋势。

Laf是什么?本质上,Laf是一个集函数计算、数据库、对象存储于一体的开发平台,可快速开发并发布应用。它包含以下功能:

云函数:运行在云端的JavaScript代码,Node.js开发者可直接上手。

云函数支持Typescript编写,无需管理服务器,可在线编写、调试、一键保存即可运行后端代码。

大多数数据获取可在客户端直接操作数据库,但在业务中,如注册、登录、文件操作、事务、第三方接口等,可直接使用云函数实现。

云数据库:前端可使用laf-client-sdk“直连”云数据库,无需与服务端对接。

配置访问策略,也可实现客户端安全操作数据库。

云存储:laf云存储基于MinIO提供对象存储服务,提供完全兼容MinIO(aws s3-api)的对象存储服务。

静态托管:laf支持静态网站托管,可快速上线静态网站,无需折腾Nginx。

laf适用于哪些场景?理论上,laf可用于开发任何应用。

未来,lafyun.com将上线应用市场,汇总收集应用,让laf用户一键使用海量应用。

如何快速开始?我们将在lafyun.com上通过开发一个简单的“用户登录/注册”功能,快速体验laf云开发。

准备工作:编写云函数,包括register处理注册请求和login处理登录请求。

用户注册云函数:在“云函数”管理页面,新建注册云函数register,编写代码,调试运行,保存并发布。

用户登录云函数:同上,创建login云函数,编写代码,调试运行,保存并发布。

使用curl调用云函数:在云函数列表页面查看并复制调用地址,或执行curl命令替换APPID。

在前端项目中使用云函数:安装laf client sdk,在Vue/React/Angular/小程序页面调用云函数完成登录注册功能。

注意事项:由于Laf功能强大,运维与后端同学可能不再需要操作基础架构和后端服务,注意控制风险。

微信小程序云开发如何实现数据库自动备份实现

前言

数据是无价的,我们通常会把重要的业务数据存放在数据库中,并需要对数据库做定时的自动备份工作,防止数据异常丢失,造成无法挽回的损失。

小程序云开发提供了方便的云数据库供我们直接使用,云开发使用了腾讯云提供的云数据库,拥有完善的数据保障机制,无需担心数据丢失。但是,我们还是不可避免的会担心数据库中数据的安全,比如不小心删除了数据集合,写入了脏数据等。

还好,云开发控制台提供了数据集合的导出,导入功能,我们可以手动备份数据库。不过,总是手动备份数据库也太麻烦了点,所有重复的事情都应该让代码去解决,下面我们就说说怎么搞定云开发数据库自动备份。

通过查阅微信的文档,可以发现云开发提供了数据导出接口databaseMigrateExport

POST

通过这个接口,结合云函数的定时触发功能,我们就可以做数据库定时自动备份了。梳理一下大致的流程:

创建一个定时触发的云函数

云函数调用接口,导出数据库备份文件

将备份文件上传到云存储中以供使用

1.获取 access_token

调用微信的接口需要 access_token,所以我们首先要获取 access_token。通过文档了解到使用 auth.getAccessToken接口可以用小程序的 appid和 secret获取 access_token。

//获取 access_token

request.get(

`${appid}&secret=${secret}`,

(err, res, body)=>{

if(err){

//处理错误

return;

}

const data= JSON.parse(body);

// data.access_token

}

);

2.创建数据库导出任务

获取 access_token后,就可以使用 databaseMigrateExport接口导出数据进行备份。

databaseMigrateExport接口会创建一个数据库导出任务,并返回一个 job_id,这个 job_id怎么用我们下面再说。显然数据库的数据导出并不是同步的,而是需要一定时间的,数据量越大导出所要花费的时间就越多,个人实测,2W条记录,2M大小,导出大概需要 3~5 S。

调用 databaseMigrateExport接口需要传入环境 Id,存储文件路径,导出文件类型(1为 JSON,2为 CSV),以及一个 query查询语句。

因为我们是做数据库备份,所以这里就导出 JSON类型的数据,兼容性更好。需要备份的数据可以用 query来约束,这里还是很灵活的,既可以是整个集合的数据,也可以是指定的部分数据,这里我们就使用 db.collection('data').get()备份 data集合的全部数据。同时我们使用当前时间作为文件名,方便以后使用时查找。

request.post(

`${accessToken}`,

{

body: JSON.stringify({

env,

file_path: `${date}.json`,

file_type:'1',

query:'db.collection("data").get()'

})

},

(err, res, body)=>{

if(err){

//处理错误

return;

}

const data= JSON.parse(body);

// data.job_id

}

);

3.查询任务状态,获取文件地址

在创建号数据库导出任务后,我们会得到一个 job_id,如果导出集合比较大,就会花费较长时间,这时我们可以使用 databaseMigrateQueryInfo接口查询数据库导出的进度。

当导出完成后,会返回一个 file_url,即可以下载数据库导出文件的临时链接。

request.post( `${accessToken}`,

{

body: JSON.stringify({

env,

job_id: jobId

})

},

(err, res, body)=>{

if(err){

reject(err);

}

const data= JSON.parse(body);

// data.file_url

}

);

获取到文件下载链接之后,我们可以将文件下载下来,存入到自己的云存储中,做备份使用。如果不需要长时间的保留备份,就可以不用下载文件,只需要将 job_id存储起来,当需要恢复备份的时候,通过 job_id查询到新的链接,下载数据恢复即可。

至于 job_id存在哪,就看个人想法了,这里就选择存放在数据库里。

await db.collection('db_back_info').add({

data:{

date: new Date(),

jobId: job_id

}

});

4.函数定时触发器

云函数支持定时触发器,可以按照设定的时间自动执行。云开发的定时触发器采用的 Cron表达式语法,最大精度可以做的秒级,详细的使用方法可以参考官方文档:定时触发器|微信开放文档

这里我们配置函数每天凌晨 2点触发,这样就可以每天都对数据库进行备份。在云函数目录下新建 config.json文件,写入如下内容:

{

"triggers": [

{

"name":"dbTrigger",

"type":"timer",

"config":"0 0 2****"

}

]

}

完整代码

最后,贴出可以在云函数中使用的完整代码,只需要创建一个定时触发的云函数,并设置好相关的环境变量即可使用

appid

secret

backupColl:需要备份的集合名称,如‘data'

backupInfoColl:存储备份信息的集合名称,如‘db_back_info'

注意,云函数的默认超时时间是 3秒,创建备份函数时,建议将超时时间设定到最大值 20S,留有足够的时间查询任务结果。

/* eslint-disable*/

const request= require('request');

const cloud= require('wx-server-sdk');

//环境变量

const env='xxxx';

cloud.init({

env

});

//换取 access_token

async function getAccessToken(appid, secret){

return new Promise((resolve, reject)=>{

request.get(

`${appid}&secret=${secret}`,

(err, res, body)=>{

if(err){

reject(err);

return;

}

resolve(JSON.parse(body));

}

);

});

}

//创建导出任务

async function createExportJob(accessToken, collection){

const date= new Date().toISOString();

return new Promise((resolve, reject)=>{

request.post(

`${accessToken}`,

{

body: JSON.stringify({

env,

file_path: `${date}.json`,

file_type:'1',

query: `db.collection("${collection}").get()`

})

},

(err, res, body)=>{

if(err){

reject(err);

}

resolve(JSON.parse(body));

}

);

});

}

//查询导出任务状态

async function waitJobFinished(accessToken, jobId){

return new Promise((resolve, reject)=>{

//轮训任务状态

const timer= setInterval(()=>{

request.post(

`${accessToken}`,

{

body: JSON.stringify({

env,

job_id: jobId

})

},

(err, res, body)=>{

if(err){

reject(err);

}

const{ status, file_url}= JSON.parse(body);

console.log('查询');

if(status==='success'){

clearInterval(timer);

resolve(file_url);

}

}

);

}, 500);

});

}

exports.main= async(event, context)=>{

//从云函数环境变量中读取 appid和 secret以及数据集合

const{ appid, secret, backupColl, backupInfoColl}= process.env;

const db= cloud.database();

try{

//获取 access_token

const{ errmsg, access_token}= await getAccessToken(appid, secret);

if(errmsg&& errcode!== 0){

throw new Error(`获取 access_token失败:${errmsg}`||'获取 access_token为空');

}

//导出数据库

const{ errmsg: jobErrMsg, errcode: jobErrCode, job_id}= await createExportJob(access_token, backupColl);

//打印到日志中

console.log(job_id);

if(jobErrCode!== 0){

throw new Error(`创建数据库备份任务失败:${jobErrMsg}`);

}

//将任务数据存入数据库

const res= await db.collection('db_back_info').add({

data:{

date: new Date(),

jobId: job_id

}

});

//等待任务完成

const fileUrl= await waitJobFinished(access_token, job_id);

console.log('导出成功', fileUrl);

//存储到数据库

await db

.collection(backupInfoColl)

.doc(res._id)

.update({

data:{

fileUrl

}

});

} catch(e){

throw new Error(`导出数据库异常:${e.message}`);

}

};

小程序云开发不用写后端吗(微信小程序的后端是如何实现的)

微信小程序需要后端吗这个问题如何看待

和网站一样,微信小程序有一个后台的。

可以在网站后台进行修改很多内容。

小程序开发需要后端吗

看您的小程序需不需要后台管理,如果像那些展示类的小程序,数据如果是死的话,就不需要后端,如果想定时更新数据的话,那就得后端开发一个后台管理

小程序云开发继承了哪些云后端能力

小程序云开发继承的云后端能力包括云函数(nodejs),云数据库(mogodb)和云存储。根据查询相关公开信息:小程序云开发采用Serverless架构,集成了腾讯云云函数、容器、云存储、云数据库等后端能力,让开发者无需自行搭建,运维服务器,即可在平台上开发、上线应用。

微信小程序需要后台吗?怎么搭建后台

微信小程序需要后台,后台就像是网站那样子的管理后台,可以上传产品信息,图片等功能。一般后端程序员把后台弄好,前端程序员就是负责整个小程序版面设计这一块,所有做个小程序就相当于做个网站,app那样。而微信平台只是把小程序开发者开发的这个小程序在微信上呈现出来,相当于一个入口而已。

云开发能代替后端吗?

云开发并不能代替后端。

但是它可以快速开发出API接口,让你的产品快速上线运营对于小型创业公司和个人试错是非常好的。

云开发简介:

云开发(CloudBase)是云端一体化的后端云服务,采用serverless架构,免去了移动应用构建中繁琐的服务器搭建和运维。同时云开发提供的静态托管、命令行工具(CLI)、FlutterSDK等能力降低了应用开发的门槛。使用云开发可以构建完整的小程序/小游戏、H5、Web、移动App等应用。

云开发与传统的前后端开发模式天然互补。基于云开发构建应用层/服务中台,能够弥补传统开发模式的“效率低、耗时多、依赖后台、不够灵活”等问题,更快响应业务需求。

阅读剩余
THE END