1. 程式人生 > >阿里雲API閘道器、函式計算、表格儲存簡單結合使用小結

阿里雲API閘道器、函式計算、表格儲存簡單結合使用小結

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)
})