Packhouse
  • Introduction
  • Versions
  • Core
    • Group
      • Mold
      • Tool
      • Line
    • Invoke
    • Utils
    • Event
    • Merger
    • Plugin
    • Main
    • Intercept Error
  • Plugins
    • Step
    • Order
  • Tooling
    • Unit Test
  • Application
    • API Service
  • From
    • GitHub
    • Metal Sheep
Powered by GitBook
On this page
  • 在開始前必須了解...
  • Install
  • Architecture
  • Invoke
  • AWS Exception

Was this helpful?

  1. Application

API Service

Packhouse API Service

PreviousUnit Test

Last updated 5 years ago

Was this helpful?

在開始前必須了解...

  • 的基本知識

  • 的架構與原理

Install

開始前你必須安裝並擁有個人的Secret Access Key允許Serverless可以建立服務。

安裝CLI工具集

npm install serverless packhouse-cli mocha -g

建立服務檔案

packhouse generate-api-service

你必須手動添加你的IAM-ROLE使你的Lambda有能力使用其他服務,可於serverless.yml中找到以下欄位:

provider:
  name: aws
  runtime: nodejs12.x
  ### 這裡
  role: YOUR-IAM-ROLE
  ###
  stage: v1
  region: us-east-1
  timeout: 30
  memorySize: 256

初始化及部署服務

建立的服務預設Region在us-east-1。

cd service
npm install
npm run deploy

Architecture

這是我們建立Packhouse前使用的架構:

由於是建立在Cloud Service的服務,因此Database的操作大多來自SDK,而不是SQL,所以讀寫資料庫的工作交由Repository:

Invoke

當你部屬好你的第一個服務後,就會看見以下這段Log:

endpoints:
  GET - https://xxxxxx.execute-api.us-east-1.amazonaws.com/v1/hello

開啟你的瀏覽器並貼上這段網址:

https://xxxxxx.execute-api.us-east-1.amazonaws.com/v1/hello?message=helloworld

即可看到你的第一個Response:

也可以在Dynamodb中看到你的Message Log:

為了避免被收取額外費用,你可以使用npm run remove指令關閉整個服務。

AWS Exception

AWS SDK的所有方法雖然都有提供promise接口,但它的promise有一個糟糕的問題,在有一定複雜的呼叫過程時如果有程式碼報錯,promise會捕捉到error卻不會觸發catch()。

// 這是個糟糕的例子 😢
let AWS = require('aws-sdk')
let client = new AWS.DynamoDB.DocumentClient()
let group = {
    tools: {
        getUser: {
            handler(self, name) {
                let parmas = {
                    TableName: 'users',
                    Key: {
                        name
                    }
                }
                // 避免如下宣告
                client.get(params).promise().then(self.success).catch(self.error)
            }
        }
    }
}
// 這是個優良案例 🤣
let AWS = require('aws-sdk')
let client = new AWS.DynamoDB.DocumentClient()
let group = {
    tools: {
        getUser: {
            handler(self, name) {
                let parmas = {
                    TableName: 'users',
                    Key: {
                        name
                    }
                }
                client.get(params, self.assess())
            }
        }
    }
}
AWS
Serverless
AWS-CLI
參考自php laravel
Packhouse的架構跟Model2相差不遠