Open21

【サーバーサイド】

Express.js

  • パスパラメータの取得
    • req.params.〇〇
  • リクエストボディの取得
    • req.body.〇〇
  • express.Router()で、routerをモジュール化する
  • ハンドラを非同期にする場合は、async 付きの即時関数で囲む
  • node.jsのconfigで定数管理
  • corsでCORS対応
  • express-validatorでリクエストパラメータのバリデーション

AWS Amplify

  • ユーザープールIDなどを、Lambdaの環境変数から取得できる。
    • amplify add functionしたときに、自動で環境変数が設定される。(他リソースを参照するかの質問にyesと答えておく必要がある。)
  • aws-sdkで、戻りがAWS.Requestのメソッドを即実行する場合は、.promise()をつける。
await cognito.adminListGroupsForUser().promise()
  • amplify add api時の設定で、APIへのアクセスを認証ユーザーのみに制限できる。(update apiであとからでもできる。)
? Restrict API access Yes
? Who should have access? Authenticated users only

https://www.farend.co.jp/blog/2020/11/aws-appsync/

LambdaからAppSyncのクエリを実行する

Runtime.ImportModuleErrorなどがでてどうしてもうまく行かない場合は、バージョンを疑う。バージョンの組み合わせ?などによってちゃんと動かない場合がある。

  • 安定稼働が確認できているバージョン
"dependencies": {
  "aws-appsync": "^3.0.3",
  "graphql-tag": "^2.10.3",
  "node-fetch": "^2.6.0"
},
  • Macでのamplify publishでエラー
    project-config.jsonの以下を修正(.cmdを削除)
    "BuildCommand": "npm.cmd run-script build",
    "StartCommand": "npm.cmd run-script start"

AppSync、GraphQL

  • フィールド名に別名をつけて取得
    <別名>: <フィールド名>
query MyQuery {
  listUsers {
    items {
      userId: id
      name
    }
  }
}
  • 複合ソートキーでbetweenを使う
      between: [
        {
          〇〇Id: "001",
          createdAt: "2021-07-27T00:00:00.000"
        },
        {
          〇〇Id: "001",
          createdAt: "2021-07-27T23:59:99.999"
        }
      ]

AppSync @connection

  • 1→多のconnection
    • User→[Post]
  • 多→1のconnection
    • Post→User
    • name:, queryField:
  • 多対多
    • User - UserGroup - Group
    • 中間テーブル
    • 中間テーブルのid, gsi
  • プライマリキー
  • セカンダリインデックス
    • @keyでname:を指定する
    • LSI
      • プライマリキーとパーティションキーが共通
    • GSI
      • プライマリキーとパーティションキーが異なる
  • パーティションキー
  • ソートキー
    • 複合ソートキー
      • @keyのnameにハイフンが使えない

多対多の定義

type User
  @model
{
  id: ID!
  name: String!
  userGroups: [UserGroup] @connection(keyName: "byUserId", fields: ["id"])
}

type Group
  @model
{
  id: ID!
  groupName: String!
  userGroups: [UserGroup] @connection(keyName: "byGroupId", fields: ["id"])
}

type UserGroup
  @model
  @key(fields: ["userId", "groupId"])
  @key(name: "byUserId", fields: ["userId"])
  @key(name: "byGroupId", fields: ["groupId"])
{
  userId: ID!
  groupId: ID!
  user: User @connection(fields: ["userId"])
  group: Group @connection(fields: ["groupId"])
}
作成者以外のコメントは許可されていません