阿里云API网关、函数计算、表格存储简单结合使用小结

本文介绍了一种基于阿里云API网关、函数计算与表格存储的Serverless用户注册登录方案。该方案无需自建服务器,完全依托于阿里云平台部署。使用Node.js编写代码,并通过阿里云SDK实现了高效的数据读写验证。
摘要由CSDN通过智能技术生成

serverless服务现在越来越火,简单写一下一个结合阿里云API网关、函数计算、表格存储实现的用户注册登录功能。

相关链接

函数计算

API网关

表格存储

主要是外部请求API网关,API网关调用相应的函数计算服务,然后我们将表格存储中的数据进行读写验证。表格存储是一种NoSQL结构的实现。我们整个过程并不需要像传统后端那样需要服务器,全都在阿里云服务平台上进行部署。代码部分是nodejs8环境进行编写。结合阿里云提供的SDK我们实现起来也是相当方便的。

// tableClient.js 定义我们表格存储的相关配置
const TableStore = require('tablestore');

const client = new TableStore.Client({
  accessKeyId: '你的accessKeyId',
  secretAccessKey: '你的secretAccessKey',
  endpoint: ' 实例的公网IP',
  instancename: '表格存储实例名'
});
module.exports = client;
// login函数
// 用户注册逻辑
const tableClient = require('./table');
const TableStore = require('tablestore');
const Long = TableStore.Long;
const baseresponse = {
    isBase64Encoded: false,
    statusCode: 200
};
async function handler(event, context, callback) {
    try {
        event = JSON.parse(event.toString());
        const body = JSON.parse(event.body); //将body的内容转成js对象
        const paramsget = {
            tableName: "user_info",
            primaryKey: [
                {
                    'username': body.username
                }
            ]
        };
        //检查是否存在那个用户名
        const getdata = await tableClient.getRow(paramsget);
        if (body.password !== body.repassword) {
            callback(null, Object.assign(baseresponse, {
                body: {
                    status: "error",
                    message: "两次密码不相同"
                }
            }));
        }
        if (getdata.row && getdata.row.attributes && getdata.row.attributes.length > 0) {
            callback(null, Object.assign(baseresponse, {
                body: {
                    status: "error",
                    message: "用户名已经存在,请换个用户名"
                }
            }));
        }

        const paramsput = {
            tableName: "user_info",
            condition: new TableStore.Condition(TableStore.RowExistenceExpectation.EXPECT_NOT_EXIST, null),
            primaryKey: [
                {
                    'username': body.username
                }
            ], // 把用户名作为主键
            attributeColumns: [
                {
                    'password': body.password
                }
            ],
            returnContent: {
                returnType: TableStore.ReturnType.Primarykey
            }
        };
        const data = await tableClient.putRow(paramsput);
        const response = Object.assign(baseresponse, {
            body: {
                status: "ok"
            }
        });
        callback(null, response);
    } catch (e) {
        callback(e);
    }

}
module.exports.handler = handler;
// regist函数
// 用户注册逻辑
const tableClient = require('./table');
const TableStore = require('tablestore');
const Long = TableStore.Long;
const baseresponse = {
    isBase64Encoded: false,
    statusCode: 200
};
async function handler(event, context, callback) {
    try {
        event = JSON.parse(event.toString());
        const body = JSON.parse(event.body); //将body的内容转成js对象
        const paramsget = {
            tableName: "user_info",
            primaryKey: [
                {
                    'username': body.username
                }
            ]
        };
        //检查是否存在那个用户名
        const getdata = await tableClient.getRow(paramsget);
        if (body.password !== body.repassword) {
            callback(null, Object.assign(baseresponse, {
                body: {
                    status: "error",
                    message: "两次密码不相同"
                }
            }));
        }
        if (getdata.row && getdata.row.attributes && getdata.row.attributes.length > 0) {
            callback(null, Object.assign(baseresponse, {
                body: {
                    status: "error",
                    message: "用户名已经存在,请换个用户名"
                }
            }));
        }

        const paramsput = {
            tableName: "user_info",
            condition: new TableStore.Condition(TableStore.RowExistenceExpectation.EXPECT_NOT_EXIST, null),
            primaryKey: [
                {
                    'username': body.username
                }
            ], // 把用户名作为主键
            attributeColumns: [
                {
                    'password': body.password
                }
            ],
            returnContent: {
                returnType: TableStore.ReturnType.Primarykey
            }
        };
        const data = await tableClient.putRow(paramsput);
        const response = Object.assign(baseresponse, {
            body: {
                status: "ok"
            }
        });
        callback(null, response);
    } catch (e) {
        callback(e);
    }

}
module.exports.handler = handler;
  • 先开通阿里云的函数计算、API网关、表格存储服务,按照文档来即可。
  • 创建表格存储实例,我这里是userinfo,然后再创建一个user_info表来存放用户的账号密码。主键设为用户名username
  • 创建了两个函数计算分别是login和regist。函数计算是通过事件驱动的,每次API网关接收到请求,就会去调用这个API网关对应的函数(可参考API网关调用函数计算)。当然我们还需要相关的授权才能让API网关去验证我们的请求
  • 在函数计算中实现我们的逻辑就可以了。callback其实类似于return执行了之后它后面的语句就不会执行了。
//客户端请求,同样利用了阿里云提供的SDK
const Client = require('aliyun-api-gateway').Client;
const client = new Client('授权过的app id', '对应的secret');
const url = 'api所在的url'
client.post(url,{
  data: {
    "password": "1231",
    "username": "diaotai2"
  },
  headers: {
    accept: 'application/json',
    "Content-Type":"application/x-www-form-urlencoded; charset=utf-8" 
  }
}).then(res =>{
  console.log(res)
})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Geek技术前线

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值