在 (JavaScript) 中 AWS AppSync測試和偵錯解析器 - AWS AppSync

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

在 (JavaScript) 中 AWS AppSync測試和偵錯解析器

AWS AppSync 根據資料來源在 GraphQL 欄位上執行解析程式。使用管道解析器時,函數會與您的資料來源互動。如JavaScript 解析程式概觀 中所述,函數會使用寫入 JavaScript 並在APPSYNC_JS執行期執行的請求和回應處理常式與資料來源通訊。這可讓您在與資料來源通訊之前和之後提供自訂邏輯和條件。

為了協助開發人員寫入、測試和偵錯這些解析程式, AWS AppSync 主控台也提供工具,以建立 GraphQL 請求和回應,並將模擬資料縮減至個別欄位解析程式。此外,您可以在 AWS AppSync 主控台中執行查詢、突變和訂閱,並查看來自 Amazon 的整個請求的詳細日誌串流 CloudWatch。這包括資料來源的結果。

使用模擬資料進行測試

叫用 GraphQL 解析程式時,它包含一個context物件,其中包含請求的相關資訊。其中包括用戶端引數、身分資訊,以及父 GraphQL 欄位的資料。它也會儲存資料來源的結果,可用於回應處理常式。如需此結構和程式設計時要使用之可用協助程式公用程式的詳細資訊,請參閱解析程式內容物件參考

寫入或編輯解析器函數時,您可以將模擬測試內容物件傳遞至主控台編輯器。這可讓您了解請求和回應處理常式如何評估,而不會實際針對資料來源執行。例如您可傳送測試 firstname: Shaggy 引數,了解該引數在範本程式碼之中使用 ctx.args.firstname 時如何進行評估。您也可以測試任何公用程式協助程式的評估,例如 util.autoId()util.time.nowISO8601()

測試解析程式

此範例將使用 AWS AppSync 主控台來測試解析器。

  1. 登入 AWS Management Console 並開啟AppSync主控台

    1. APIs儀表板 中,選擇您的 GraphQL API。

    2. Sidebar 中,選擇函數

  2. 選擇現有函數。

  3. 更新函數頁面頂端,選擇選取測試內容 ,然後選擇建立新內容

  4. 選取範例內容物件,或在下方的設定測試內容視窗中JSON手動填入 。

  5. 輸入文字內容名稱

  6. 選擇 Save (儲存) 按鈕。

  7. 若要使用此項模擬的內容物件評估解析程式,選擇 Run Test (執行測試) 按鈕。

如需更實用的範例,假設您有一個應用程式存放 GraphQL 類型的 Dog,該應用程式使用自動產生物件 ID,並將其存放在 Amazon DynamoDB 中。您也想要從 GraphQL 突變的引數寫入一些值,並僅允許特定使用者查看回應。下列程式碼片段顯示結構描述的外觀:

type Dog { breed: String color: String } type Mutation { addDog(firstname: String, age: Int): Dog }

您可以撰寫 AWS AppSync 函數並將其新增至addDog解析器以處理突變。若要測試 AWS AppSync 函數,您可以填入內容物件,如下列範例所示。下列引數來自 nameage,以及將 username 填入 identity 物件之中的用戶端:

{ "arguments" : { "firstname": "Shaggy", "age": 4 }, "source" : {}, "result" : { "breed" : "Miniature Schnauzer", "color" : "black_grey" }, "identity": { "sub" : "uuid", "issuer" : " https://cognito-idp.{region}.amazonaws.com/{userPoolId}", "username" : "Nadia", "claims" : { }, "sourceIp" :[ "x.x.x.x" ], "defaultAuthStrategy" : "ALLOW" } }

您可以使用下列程式碼來測試函數 AWS AppSync:

import { util } from '@aws-appsync/utils'; export function request(ctx) { return { operation: 'PutItem', key: util.dynamodb.toMapValues({ id: util.autoId() }), attributeValues: util.dynamodb.toMapValues(ctx.args), }; } export function response(ctx) { if (ctx.identity.username === 'Nadia') { console.log("This request is allowed") return ctx.result; } util.unauthorized(); }

評估的請求和回應處理常式具有來自測試內容物件的資料,以及來自 產生的值util.autoId()。此外,若您將 username 變更為 Nadia 以外的值,將不會傳回結果,因為授權檢查將會失敗。如需精細存取控制的詳細資訊,請參閱授權使用案例

使用 的測試請求和回應處理常式 AWS AppSync APIs

您可以使用 EvaluateCodeAPI命令,以模擬資料遠端測試程式碼。若要開始使用 命令,請確定您已將 appsync:evaluateMappingCode 許可新增至政策。例如:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "appsync:evaluateCode", "Resource": "arn:aws:appsync:<region>:<account>:*" } ] }

您可以使用 AWS CLI或 來利用 命令AWS SDKs。例如,從上一節取得Dog結構描述及其 AWS AppSync 函數請求和回應處理常式。使用本機工作站CLI上的 ,將程式碼儲存到名為 的檔案code.js,然後將context物件儲存到名為 的檔案context.json。從 Shell 執行下列命令:

$ aws appsync evaluate-code \ --code file://code.js \ --function response \ --context file://context.json \ --runtime name=APPSYNC_JS,runtimeVersion=1.0.0

回應包含 evaluationResult,其中包含處理常式傳回的承載。它還包含物件,該logs物件會保留您的處理常式在評估期間產生的日誌清單。這可讓您輕鬆地對程式碼執行進行偵錯,並查看評估的相關資訊,以協助疑難排解。例如:

{ "evaluationResult": "{\"breed\":\"Miniature Schnauzer\",\"color\":\"black_grey\"}", "logs": [ "INFO - code.js:13:5: \"This request is allowed\"" ] }

evaluationResult 可以剖析為 JSON,提供:

{ "breed": "Miniature Schnauzer", "color": "black_grey" }

使用 SDK,您可以輕鬆整合來自您最愛測試套件的測試,以驗證處理常式的行為。我們建議您使用 Jest 測試架構 建立測試,但任何測試套件都可以運作。下列程式碼片段顯示假設驗證執行。請注意,我們預期評估回應是有效的 JSON,因此我們會使用 JSON 從字串回應JSON.parse擷取:

const AWS = require('aws-sdk') const fs = require('fs') const client = new AWS.AppSync({ region: 'us-east-2' }) const runtime = {name:'APPSYNC_JS',runtimeVersion:'1.0.0') test('request correctly calls DynamoDB', async () => { const code = fs.readFileSync('./code.js', 'utf8') const context = fs.readFileSync('./context.json', 'utf8') const contextJSON = JSON.parse(context) const response = await client.evaluateCode({ code, context, runtime, function: 'request' }).promise() const result = JSON.parse(response.evaluationResult) expect(result.key.id.S).toBeDefined() expect(result.attributeValues.firstname.S).toEqual(contextJSON.arguments.firstname) })

這會產生下列結果:

Ran all test suites. > jest PASS ./index.test.js ✓ request correctly calls DynamoDB (543 ms) Test Suites: 1 passed, 1 total Tests: 1 passed, 1 total Snapshots: 0 totalTime: 1.511 s, estimated 2 s

偵錯即時查詢

測試和日誌記錄無法取代 end-to-end除錯生產應用程式。 AWS AppSync 可讓您使用 Amazon 記錄錯誤和完整請求詳細資訊 CloudWatch。此外,您可以使用 AWS AppSync 主控台測試 GraphQL 查詢、突變和訂閱,以及將每個請求即時串流日誌資料傳回查詢編輯器以進行即時偵錯。針對訂閱,日誌會顯示連線時間資訊。

若要執行此操作,您需要事先啟用 Amazon CloudWatch 日誌,如監控和記錄 中所述。接下來,在 AWS AppSync 主控台中選擇查詢索引標籤,然後輸入有效的 GraphQL 查詢。在右下方區段中,按一下並拖曳日誌視窗以開啟日誌檢視。在頁面頂端,選擇執行箭頭圖示來執行您的 GraphQL 查詢。稍後,您操作的完整請求和回應日誌會串流到本節,您可以在主控台中檢視它們。