serverless服务现在越来越火,简单写一下一个结合阿里云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)
})