普通云对象和云函数

1,089 阅读4分钟

云对象,其实是对云函数的封装

云对象作为云函数的一种,可以调用所有node的API和uniCloud的API。

uniCloud有众多API,另见:uniCloud的API清单

除上述API之外,云对象的this对象还有一批专用方法来获取当前请求的上下文信息。

与云函数入参时的context不同,云对象没有context。它通过this对象挂载的几个内置方法来获取上下文信息。请注意开发者避免在this上挂载同名方法。

云对象多个方法共享逻辑

一个云对象导出的不同方法之间不能互相调用。比如下面示例中 tryAddTodo 方法内部无法调用 addTodo 方法。

只能将多个方法共享的逻辑放到云对象导出的对象外部来供云对象的方法调用。例如下面抽离公共函数 pureAddTodo :



// todo.obj.js
// 方法前的async是根据自己的业务来的,不是必须async

async function pureAddTodo(title, content) {
	// ...add todo 逻辑
}

module.exports = {
	async tryAddTodo() {
		try {
			return addTodo(title, content) // 一定会失败。只能调用 pureAddTodo 这样的非导出方法。
		} catch (e) {
			return {
				errCode: 'add-todo-failed'
			}
		}
	},
	async addTodo(title, content) {
		return pureAddTodo(title, content)
	}
}

云对象 自动显示交互界面

从HBuilderX 3.4.6起,调用云对象的方法时,默认会自动显示交互/提示界面。

  • 如需自定义默认显示的UI,配置如下:
uniCloud.importObject('todo', {
	customUI: false, // 是否取消自动展示的交互界面。默认为false,配置为true时取消自动展示的交互提示界面,以下配置均不再生效
	loadingOptions: { // loading相关配置
		title: '加载中...', // 显示的loading内的提示文字。默认值为:加载中...
		mask: true // 是否使用透明遮罩,配置为true时不可点击页面其他内容。默认值为:true
	},
	errorOptions: { // 错误界面相关配置
		type: 'modal', // 错误信息展示方式,可取值:modal(弹框,默认)、toast(toast消息框)。默认值为:modal
		retry: false // 是否展示重试按钮,仅在type为modal时生效。用户点击重试按钮时将重新请求调用的方法,默认为false
	}
})

云对象和云函数使用定时触发

云对象

配置方式和云函数一致,请参阅上方章节

配置完成后会定时触发云对象内置特殊方法_timing

云对象代码示例:

module.exports = {
	_timing: function () { 
		console.log('triggered by timing')
	}
}

  • 定时触发云对象时,_before_after均不执行
  • 定时触发云对象时_timing方法不会收到任何参数

普通云函数

直接调用云函数,可以区分调用方式

'use strict';
exports.main = async (event, context) => {
  let source = context.SOURCE // 当前云函数被何种方式调用
  // client   客户端callFunction方式调用
  // http     云函数url化方式调用
  // timing   定时触发器调用
  // server   由管理端调用,HBuilderX里上传并运行
  // function 由其他云函数callFunction调用
}

注意事项

  • 云对象和云函数都在cloudfunctions目录下,但是不同于云函数,云对象的入口为index.obj.js,而云函数则是index.js为正确区分两者uniCloud做出了限制,云函数内不可存在index.obj.js,云对象内也不可存在index.js。
  • 所有_开头的方法都是私有方法,客户端不可访问
  • 云对象也可以引用公共模块或者npm上的包,引用方式和云函数一致。
  • 云对象的导出的方法不可以是箭头函数,导出箭头函数会导致this指向不正确

处理cookie

在某些场景下,cookie依然占有重要地位,例如在云函数URL化的情况下,获取客户端的状态

在云函数中使用cookie需要依赖cookie库npm页面地址 (opens new window),可以通过npm inistall cookie 安装

  • 普通云函数示例
'use strict';
//引入cookie
const cookie = require('cookie')
exports.main = async (event, context) => {
	const cookieData = cookie.parse(event.headers.cookie || '')
	//设置cookie到客户端
	const cookieOptions = {
		//具体参数请查阅 https://www.npmjs.com/package/cookie
		maxAge: 60 * 60 * 24 * 7,//一周
		path:"/"
	}
	const setCookieData = cookie.serialize('app', 'appName', cookieOptions)
	return {
		statusCode: 200,
		headers: {
				'content-type': '返回数据类型',
				'set-cookie': setCookieData // 在headers内返回set-cookie用于设置客户端cookie
		},
		body: '返回数据'
	}
};

  • 云对象示例
'use strict';
//引入cookie
const cookie = require('cookie')
module.exports = {
  addTodo: function () {
    const httpInfo = this.getHttpInfo()
    const cookieData = cookie.parse(httpInfo.headers.cookie || '')
    //设置cookie到客户端
    const cookieOptions = {
    	//具体参数请查阅 https://www.npmjs.com/package/cookie
    	maxAge: 60 * 60 * 24 * 7,//一周
    	path:"/"
    }
    const setCookieData = cookie.serialize('app', 'appName', cookieOptions)
    return {
    	statusCode: 200,
    	headers: {
    			'content-type': '返回数据类型',
    			'set-cookie': setCookieData // 在headers内返回set-cookie用于设置客户端cookie
    	},
    	body: '返回数据'
    }
  }
};