Serverless雲の最初の観察


Serverless Cloud からの新しいServerlessアプリプラットフォームですServerless, Inc. 会社の初期製品とは異なりServerless Framework , AWSに直接アプリケーションを配備しません.代わりに、あなたのアプリは即座に展開され、ダッシュボードとリアルタイムのログでクラウド内の新しいホスティングサービスに住んでいます.
このプロジェクトのすべてのコードを見つけることができますon my GitHub .

インストールクラウド
インストール@serverless/cloud からnpm .
npm i -g @serverless/cloud

初期化サービス
お使いのローカルマシン上の空白のフォルダーをサービスのコードに作成し、cloud コマンド.
mkdir ajcwebdev-serverless-cloud
cd ajcwebdev-serverless-cloud
cloud
お使いのブラウザが自動的に開き、CLIを介してログインしたり、ログインリンクを端末に提供します.したら、起動時に入力するアクティベーションコードを与えられる接続されます.

ステージング環境への配備
サービス名を指定し、deploy dev 対話型端末で.
deploy dev
また、使用することができますcloud deploy dev これらのプロジェクトのうちの1つをRepoからクローン化して、すぐにそれを展開したいならば.
cloud deploy dev
配備されますendpoint サンプルtodoアプリで.

いくつかのTodosを追加します.


プロジェクトコード
package.jsonThe @serverless/cloud パッケージはデフォルトでクラウドランタイムに含まれています.したがって、package.json .
{
  "name": "ajcwebdev-serverless-cloud",
  "version": "1.0.0",
  "description": "Serverless Cloud todo api",
  "main": "index.js",
  "type": "module",
  "scripts": {
    "start": "cloud",
    "test": "cloud test"
  },
  "devDependencies": {
    "@jest/globals": "^27.1.0",
    "@serverless/cloud": "^0.0.22"
  },
  "serverless": {
    "org": "ajcwebdev",
    "service": "ajcwebdev-serverless-cloud"
  }
}
index.js我々はモジュールから一握りのモジュールをインポートする@serverless/cloud 我々のトップでindex.js ファイル.
// index.js

import {
  api,
  data,
  schedule,
  params
} from '@serverless/cloud'
  • api は、残りのAPIをビルドするために使用されます.
  • api.get - GET 方法
  • api.post - POST 方法
  • api.delete - DELETE 方法
  • api.use - ミドルウェア
  • data はサーバレスデータにアクセスする.
  • data.get - データを読み込む
  • data.getByLabel - 指定したラベルでデータを読み込む
  • data.set - データを記憶に書き込む
  • data.remove - データを削除する
  • schedule は、スケジュールされたタスクを作成するために使用されます.
  • schedule.every - 60分ごとに指定された時間間隔で走る
  • getTodos 機能
    この関数は、異なるAPIパスで再利用できます.
    // index.js
    
    const getTodos = async (status, meta) => {
      let result
    
      if (status === 'all') {
        result = await data.get('todo:*', meta)
      } else if (status === 'complete') {
        result =  await data.getByLabel('label1','complete:*', meta)
      } else {
        result = await data.getByLabel('label1','incomplete:*', meta)
      }
    
      return {
        items: result.items.map(
          item => item.value
        )
      }
    }
    
    GET 藤堂項目/todosこの関数はgetTodos ステータスで関数を返し、結果を返します.
    // index.js
    
    api.get('/todos', async (req, res) => {
      let result = await getTodos(
        req.query.status,
        req.query.meta ? true : {}
      )
    
      console.log(params.CLOUD_URL)
    
      res.send({
        items: result.items
      })
    })
    
    POST TODO項目への更新'/todos/:id'この関数はbody を返します.data . The body を含めることができますduedate . また、含まれてid , createdAt 日付と時刻status それでcomplete or incomplete . TODOの設定後getTodos クエリはすべてのtodosで再度実行され、更新されたリストが返されます.
    // index.js
    
    api.post('/todos/:id', async (req, res) => {
      console.log(new Date().toISOString())
    
      let body = req.body
      if (body.duedate) {
        body.duedate = new Date(body.duedate).toISOString()
      }
    
      await data.set(
        `todo:${req.params.id}`,
        {
          ...body,
          createdAt: Date.now()
        },
        Object.assign({},
          req.body.status ? 
            { 
              label1: body.status === 'complete'
                ? `complete:${new Date().toISOString()}` 
                : `incomplete:${body.duedate ? body.duedate : '9999' }` }
            : null
        )
      )
    
      let result = await getTodos(
        req.query.status
      )
    
      res.send({
        items: result.items
      })
    })
    
    に注意を払わないternary soup インObject.assign それが何の意味もないならば.だけでそれを残して、それを触れないでください.
    DELETE 藤堂項目'/todos/:id'この関数は、data.remove そして、リストの残りのtodosを検索して返します.
    // index.js
    
    api.delete('/todos/:id', async (req, res) => {
      await data.remove(`todo:${req.params.id}`)
    
      let result = await getTodos(req.query.status)
    
      res.send({
        items: result.items
      })
    })
    

    カスタムエラーハンドラミドルウェア
    この関数はエラー処理のためのミドルウェアを提供します.エラーも、devモードであなたの端末にライブ配信されます.
    // index.js
    
    api.use((err, req, res, next) => {
      console.error(err.stack)
    
      if (!err.statusCode) {
        err.statusCode = 500
      }
    
      const error = {
        name: err.name,
        statusCode: err.statusCode,
        message: err.message,
      }
    
      res.status(err.statusCode).json(error)
    })
    

    時間の経過を追ってschedule.every場合によっては、スケジュールのコードを実行する必要があります場合は、警告のときにアイテムが期限切れに送信したい.この関数は、期限切れになったアイテムをループし、必要な場合は警告を送ります.
    // index.js
    
    schedule.every("60 minutes", async () => {
      console.log(`Checking for overdue TODOs...`)
    
      let overdueItems = await data.getByLabel(
        'label1',
        `incomplete:<${new Date().toISOString()}`
      )
    
      if (overdueItems.items.length === 0) {
        console.log(`Nothing overdue!`)
      }
    
      for (let item of overdueItems.items) {
        console.log(
          `ALERT: '${item.value.name}' is overdue!!!`
        )
      }
    })
    

    サンプル・トードdata.json
    {
      "key": "todo:1",
    
      "value": { 
        "id": "1", 
        "name": "Deploy an amazing Serverless Cloud app",
        "status": "complete",
        "completed": "2021-07-01T12:00:00.000Z",
        "createdAt": 1627316142196
      },
    
      "label1": "complete:2021-07-01T012:00:00.000Z"
    },
    

    テスト
    テストがあります.ある日、テストを書きます.

    静的資産
    あなたからの静的資産を提供することができますstatic フォルダ.現在使用中のフォルダ
  • assets 画像のフォルダ
  • index.html メインページ
  • styles.css スタイリング
  • todos.js すべての反応コードのためにあなたのチームのバックエンド開発者を怖がらせることができます

  • 変更するindex.html と展開する
    変更する<header> インindex.html .
    <header>
      <div>
        <h1 class="text-center">
          ajcwebdev serverless cloud
        </h1>
    
        <h3 class="grey text-center">
          Seriously, there are so few servers you wouldn't believe it
        </h3>
      </div>
    </header>
    
    での展開cloud deploy prod or deploy prod 対話型端末セッションで.
    cloud deploy prod
    
    The link あなたのクリップボードの原因に自動的に貼り付けられたリンクをコピーする必要がありますnoobsのです.


    ダッシュボード
    これは、ダッシュボードを持っていることを意味雲ですので、右?どのように、私は私のClickops任務を実行することができますか?

    サービス
    Serverless雲を使用すると、チームの組織内のサービスを構築することができます.

    あなたは、さまざまなサービスとしては、さまざまなユースケースやアプリケーションのように作成することができます.

    インスタンス
    各インスタンスは、サービス内のすべての他のインスタンスと完全に分離され、データの独自のコピーを格納します.

    インスタンス内の環境は同一であるため、アプリケーション全体を完全に同じように動作させることができます.

    計量
    数字についての情報を教えてください.


    概要
    かなりクール.何も爆破、それは予想通りに動作し、私は10秒未満で配備されたアプリケーションを持っていた.

    資源
  • Documentation
  • GitHub repository