阿里雲API閘道器、函式計算、表格儲存簡單結合使用小結
阿新 • • 發佈:2019-01-02
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)
})