「AWS無料相談会」をオンラインで開催中

Denoを触ってみる

最近モンスターエナジーを箱買いしました。関口です。

今回は今年5月に正式版がリリースされたDenoに軽く触れてみた内容を記載したいと思います。

事前準備

公式よりDenoをインストールしてください。

VSCodeJetBrainsIDEではDeno用のプラグインが既に存在しますので、こちらも適宜導入してください。

簡易なAPIを作成する

今回はミドルウェアとしてoakを利用します。
ApplicationRouterをoakからインポートして、アプリケーションサーバーの作成とルートを設定します。

app.ts

import { Application } from 'https://deno.land/x/oak/mod.ts'
import router from './router.ts'

const env = Deno.env.toObject()
const HOST = env.HOST || '127.0.0.1'
const PORT = env.PORT || 7700

const app = new Application()

app.use(router.routes())
app.use(router.allowedMethods())

console.log(`Listening on port ${PORT} ...`)
await app.listen(`${HOST}:${PORT}`)

route.ts

import { Router }from 'https://deno.land/x/oak/mod.ts'
import { getBooks, getBook, addBook, updateBook, deleteBook } from './controller.ts'

const router = new Router()
router.get('/books', getBooks)
    .get('/books/:isbn', getBook)

export default router

GETを試す

簡単なGetメソッドを作成します。

controller.ts

interface IBook {
    isbn: string;
    author: string;
    title: string;
}

let books: Array<IBook> = [{
    isbn: "1",
    author: "Robin Wieruch",
    title: "The Road to React",
},{
    isbn: "2",
    author: "Kyle Simpson",
    title: "You Don't Know JS: Scope & Closures",
},{
     isbn: "3",
     author: "Andreas A. Antonopoulos",
     title: "Mastering Bitcoin",
 }]

export const getBooks = ({ response }: { response: any }) => {
    response.body = books
}

Denoで書かれたアプリを起動します

$ deno run --allow-net --allow-env app.ts
Listening on port 7700 ...

http://localhost:7700/booksにアクセスすると、booksarrayが返されます。

テストコード

お試しで単純な関数とそれに対応する対応するテストを作成します。

sample.ts

export const add = (a: number, b: number) => {
    return a + b;
}

sample.test.ts

import { add } from "./sample.ts";
import { assertEquals } from "https://deno.land/std/testing/asserts.ts";

Deno.test("it should add two numbers", () => {
    assertEquals(add(1, 2), 3);
});

deno testコマンドでテストを実行できます

$ deno test --allow-net
running 1 tests
test it should add two numbers ... ok (8ms)

test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

参考

Simple REST API with Deno
Your First Deno Server in 60 Lines
How To Write Spec Tests In Deno