评论

微信小程序云开发云函数路由,担心云函数不够用的可以看下这里

小程序云开发,一个云函数做整个项目

一 首先我们看下云函数结构

分为 controllers 控制器 service 服务逻辑 utils 工具类

二 修改入口文件根据不同路由进入不同的文件

// 云函数入口文件
const cloud = require('wx-server-sdk')
const response = require('./utils/response')

cloud.init()

// 云函数入口函数
exports.main = async (event, context) => {
	const wxContext = cloud.getWXContext()
//这个是重点,小程序传过来的时候要带 controller 控制器和 action 函数名过来
	if (!event.controller || !event.action) {
		return response.error()
	}
	try {
	 	//根据不同的控制器,引入不同的控制器文件
		const server = require('./controllers/' + event.controller)
		//调用控制器里面的方法
		return server.getInstance({
			router: event.controller + '/' + event.action,
			event: event
		})[event.action]()

	} catch (e) {
			return response.error('系统错误')


	}


}




重点是前端得传 controller 和 action 过来,然后根据不同的控制器和函数名调用不同的文件

里面出现的response文件,我也先给大家看下,避免不知道是什么意思

这个返回信息的封装 response.js


 module.exports = {
   success: function (msg = '成功', result = {}, status = 0) {

     return {
       msg: msg,
       result: result,
       status: status
     }
   },
   error:function (msg = '失败', result = {}, status = -1) {

    return {
      msg: msg,
      result: result,
      status: status
    }
  }
 }

三 首先创建一个基础控制器

以后一些挂载函数可以在里头挂载

登录的控制器 Base.js

const cloud = require('wx-server-sdk')
cloud.init({
	env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
const response = require('../utils/response');



class Base {
	//构造函数方法
	constructor(option={}) {
		this.response = response
		this.request = option.event
		this.router = option.router
		
	}
	static getInstance(option={}) {
		if (!this.instance) {
			this.instance = new this(option);
		}

		return this.instance;
	}

	

}

module.exports = Base;


四 可以开始写控制器方法了

比如写个获取商品列表的控制器Goods.js

const Base = require('./Base')
class Goods extends Base {
	//构造函数方法
	constructor(option={}) {
		super(option);

	}
	async list() {
		//商品列表
		let list = [];
		
		
		return this.response.success('成功',{list:list });
	}	
	async add() {
		//添加商品

		
		
		return this.response.success('成功');
	}	
}

module.exports = Goods;


这样一个获取商品列表的链接就做好了,

如果要写多其他的功能,就在controller里建js控制器,然后继承base,就可以了

五 小程序端的请求

我用的是Uniapp开发

目录结构如下

首先我封装一个请求工具

request.js

export async function  request(url, data = {}) {

	const url_list = url.split('/')

	data.controller = url_list[0]
	data.action = url_list[1]
	

	return new Promise((r, s) => {
		

		wx.cloud.callFunction({
			// 云函数名称
			name: 'request',
			// 传给云函数的参数
			data: data,
			success: function(res) {
				let res_data = res.result
				
				
				r(res_data);
			},
			fail: function(res) {
				s(res);
			}
		})




	})
}


然后把所有要请求的接口写在api.js文件里

import {request} from "./request";

//商品列表
export function goodsList(data){
	return request('Goods/list',data);
}
//添加商品
export function goodsList(data){
	return request('Goods/add',data);
}

然后就可以调用了

import {goodsList} from "@/api/api.js";

//就可以拿到商品列表了
let list = await goodsList();


封装好后,小程序的请求,大家有没有觉得开发跟以前跟后端对接的形式一样

这是用云开发开发的小程序,可以参考一下


点赞 3
收藏
评论

1 个评论

  • 渡可度之人
    渡可度之人
    2021-02-08

    新建的控制器users里列出用户数据,怎么不执行啊,总是返回成功,数据值9

      async list() {

        //用户列表

        let list = [];

        let temp=9;


        this.db.collection('userInfo').get({

          success: res => {

            return this.response.success('res',res);  

          },

          fail: res => {

            return this.response.success('失败',temp);

          }

        })          

        return this.response.success('成功',temp);    //{list:list }

      } 



    2021-02-08
    赞同
    回复
登录 后发表内容