@cloudbase/cloud-api
云 API 3.0 请求封装,仅适用于 Node。
调用云API
支持 API 秘钥或临时秘钥鉴权。
import { CloudApiService } from '@cloudbase/cloud-api'
const service = new CloudApiService({
service: 'tcb',
credential: {
secretId: 'xxx',
secretKey: 'xxx',
token: 'xxx'
}
})
service.request('DescribeEnvs').then(console.log)
service
.request({
action: DescribeEnvs
})
.then(console.log)
或
const { CloudApiService } = require('@cloudbase/cloud-api')
const service = new CloudApiService({
service: 'tcb',
credential: {
secretId: 'xxx',
secretKey: 'xxx'
}
})
service.request('DescribeEnvs').then(console.log)
结果
{
EnvList: [],
RequestId: '09a1ece6-7cb1-4a8f-b8b6-e4cc066d1fbe'
}
异步 credential
在某些情况下,你的 credential 可能是异步获取。你可以配置 getCredential 方法,异步传递 credential 信息。建议结合 getInstance() 方法使用,避免重复请求获取 credential 信息。
const tcbService = CloudApiService.getInstance({
service: 'tcb',
getCredential: async () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve({})
}, 1000)
})
}
})
const res = await tcbService.request('DescribeEnvs')
request()
定义:async request(action: string, data: Record<string, any> = {}, method: 'POST' | 'GET' = 'POST')
使用 request 方法发起请求。
getInstance()
getInstance() 静态方法内部是一个工厂函数,会根据服务类型缓存实例,能有效避免重复初始化实例带来的开销
const tcbService = CloudApiService.getInstance({
credential,
service: 'tcb'
})
const res = await tcbService.request('DescribeEnvs', {
empty: null,
b: undefined
})
清除内存中的 credential 缓存
在某些特殊的情况下,你可能需要在不退出进程的情况下重载 credential。你可以使用 clearCredentialCache() 方法清除内存中的 credential 缓存,使得下次请求前通过 getCredential 函数重新获取 credential
const tcbService = new CloudApiService({
service: 'tcb',
getCredential: () => {
return new Promise((resolve) => {
setTimeout(() => {
resolve(credential)
}, 1000)
})
}
})
const res = await tcbService.request('DescribeEnvs')
tcbService.clearCredentialCache()
const res = await tcbService.request('DescribeEnvs')
选项
下面是 TS 定义
interface ServiceOptions {
service: string
version?: string
proxy?: string
timeout?: number
baseParams?: Record<string, any>
credential?: Credential
getCredential?: () => Promise<Credential> | Credential
}
interface Credential {
secretId: string
secretKey: string
token?: string
}
调用weda后端
import { wedaRequest } from '@cloudbase/cloud-api'
wedaRequest({
action: 'DescribeWedaUserId',
credentials: {
secretId: 'xxx',
secretKey: 'xxxx',
sessionToken: 'xxxxxx',
},
envId: 'xxx-xxxx',
envType: 'pre',
uid: 'xxxxxx',
uidSource: 1
}).then(res => console.log(res))
wedaRequest(params: IWedaRequestParams, config?: Partial<IWedaConfig>): Promise<any>
export interface IWedaRequestParams {
action: string;
credentials: ICredentials | (() => Promise<ICredentials>)
envId: string;
clientIp?: string
requestId?: string
envType: 'pre' | 'prod'
uid: string;
source: 1 | 2 | 3 | 4
data?: Record<string, any>
}
interface IWedaConfig {
url: string
target?: string
method: string
headers?: Record<string, any>
proxy?: string
}
interface ICredentials {
secretId: string
secretKey: string
sessionToken: string
}
在tcb云函数中获取uid及uidSource
export function getUserSource(context) {
const envInfo = tcb.getCloudbaseContext(context);
const openId: string | undefined = envInfo.WX_FROM_OPENID || envInfo.WX_OPENID;
const uid = envInfo.TCB_UUID;
if (!openId && !uid) {
return;
}
return {
source: openId ? 2 : 1,
uid: openId || uid,
};
}
调试
调试时, 可以通过在环境变量中增加 NODE_DEBUG=weda-request 来打印出详细的冗余日志