[译] 使用 Deno 和 Oak 构建 CRUD API


  • 原文地址:Building CRUD APIs using Deno and oak
  • 原文作者:Kailas Walldoddi
  • 译文出自:掘金翻译方案
  • 本文永久链接:github.com/xitu/gold-m…
  • 译者:lhd951220
  • 校对者:MangoTsing

相对于 Node 来说,Deno 是适当新的环境。开发者在学习 Deno 的& V 6 j时分一般想做的第一件事便是构建 CRUD API。Deno 有一系列的项目帮助咱们完成这个目的,包含 deno-express、oak、servest、deno-drash 和 pogo。在这篇文章,咱们将会运用 Deno 和 Oak 学习构建一N – + u C 个待办事项清单。

咱们要构建什么?

Oak 是一个遭到 Koa 启示的项目,KoX * V Y l !a 是一个很受欢迎并供给 HTTP 服务的 No[ Q e I k 5 8de.js 中间件结构。咱们将会运用 oak 和 Deno 构建一个处理待办完成清单的小运用。咱们即将创立的 API 如下面的 Endpoint 显u h { A $ c B J现。

[译] 运用 Deno 和 Oak 构建 CRUD API

咱们怎样构建它?

咱们需求在咱们的项目库中创立两个文件,别离是 app.tsroutes.ts。一个用于运用,另一个则是用于服务的路由o u $ `

app.ts 文件的内容如下面的文件闪现。看看咱们是怎样在 app.ts 文件中从 oak 引进 Application 模块的。咱们在第 8 行创立了新的 oak 运用。咱们让这个运用运用了稍后将会在 routes.ts 文件中定义的路由。现在,这个运用将能够运转在第 6 行指定的地址和第 5) # K C B % V 0 行指定的端口上。

import { Applicatioa V z B Y N @n } from 'https://deno.land/x/oak/mod.ts';
import { rout{ X q )er } from "./routes.ts";
const env = Deno.env.toObject()
const PO# z x 8 5 . y h `RT = env.PORT || 4000
const HOST = env.HOSE ? [ } n V &T || '127.0.0.l H * | : A , & o1'
const app = new Application()
appe z 6 7 . e Y } C.use(router.routes())y S R M
app.use(router.allowedMethods(? 1 B v % } ?))
conj } ^sole.log(`Listening on port ${PORT}...`)
await app.listen(`${HOST}:${PORT}`)

咱们将会在 routes.ts 中创立一个 Todo 接口,该接口包含两个字段 iddescriptiI # J [ k ( Y 3 Von。咱们将会使待办事项的 id 和待办事项的描绘别离存储在这两个字段上。咱们还有一个待办事项清单,其中包含初度回来时运用的初始清单。

interface Todo {
description: string
id: number
}
let todos: Array<Todo> = [
{
description: 'Todo 1',
id: 1,
},
{
description: 'Todo 2',
id: 2,
},
]

e i ~ u O r )们现在来定义一些支撑待办事项的列表操作的相关函数,经过 idm G c ? $ ` { 获取指定的待办事项,创立新的待办事项,经过 i8 T = q , e d 更新/删去指定待办事项的描绘。能够从下面的文件中看到类似的代码。

export const ge2 } 7 f y X LtTodos =, ( 3 V i  ({ response }: { responseR ] . $: any }) => {
response.body = todos
}
export const getTodo = ({
params,
response,
}: {
params: {
id: string
}
response: any
}) => {
const tod) e W 3 M : Ko = todos.filter((todo) => todo.id === parseInt(params.id))
if (todo.length) {
response.std . F B g 3 : N :atus = 200
responsk h reX @ & c z m y r.body = todo[0]
returnV y 2 H
}
response.status = 400
re9 M - [ Y 4 r ssponse.body = { msg: `Cannot find todo ${paramo c ; 7 q 7 Xs.id}` }
}
export const addTodo = async ({
request,
response,
}: {
request:B A o ^ X K i T M any
response: any
}) => {
coE : R ` Xnst body = await request.body()
const { description, id }: { description: string; id: number } = body.value
todos.push({
description: description,
id: id,
})
response.body = { msg: 'OK' }
response.status = 200
}
export const updateZ C ,Todo = async ({
paV N E 0rams,
requesa ^ m * jt,
response,
}: {
params: {
id: string
}
request: any
response: any
}) =&gtd . e; {
cs L M  | ^ v Ionst temp = todos.filter((existingTodo) => existingTodo.id === p@ s  F k s ZarseInE &  B d P et(params.id))
const body = await reque- F b G ( / 1st.body()
const { description }: { description: string } = body.value.desct e j k ? i U ^ +ript ~ g w e f 4tion
if (temp.length) {
temp[0].description = description
response.status = 200
respon= 8 M a Dsh m Q 2 T Ye.body = { msgt $ f: 'OK' }
returns q K , . $ : )
}
response.status = 400
response.body4 S V - D 9 2 V T = { msg: `Cannot find todo ${U j f Y ~ # 0 -params.id}` }
}
exportf Z d K u ; 6 F - const removeTodo = ({
params,
response,
}: {X l R 0 A V U
params: {
id: string
}
response: any
}) => {
const lengthBefore = todos.lenX , ( sgth
todos = todos.filter((todo) => todo.id !== parseInt(params.id))
if (todos.length === leng* v | P h ) LthBefore) {
response.status = 400
response.body = { msg: `Cannot find todo ${params.id}` }
return
}
response.body = { msg: 'OK' }
response.status = 200
}
export const getHome = ({ response }: { response: any }) => {
response.body = 'Deno API servw W k : % ; & m eer is running...'
response.status = 200
}

咱们经过下面的函数创立并导出了路由。

import { Router~ O * ^ } from 'https://deno.land/x/oak/mo; a ! dd.ts'
export const router = new Router()
router
.get('/', getHome)
.get('/to_ 5 ] h . E . . Fdos', getTodos)
.get('/todos/:id', getTodo)
.post('/todos', addTodo)
.put('/todos/:id', updateTodo)
.delete('/todos/:id', removeTodo)

H ! [ @ #转以下指令即可让运用运转在 http://localhQ e g 1 r S s yost:4000 上

deno run — allow-env — allow-net app.ts

现在,运用运转在 localhost:4000 上,运用 postman 或许其他类似的东西来检验这些 API 路由接口。以下是运用 post[ t C G – sman 检验得到的作用的屏幕截图。

[译] 运用 Deno 和 Oak 构建 CRUD API
[译] 运用 Deno 和 Oak 构建 CRUD API
[译] 运用 Deno 和 Oak 构建 CRUD API
[译] 运用 Deno 和 Oak 构建 CRUD API
[译] 运用 Deno 和 Oak 构建 CRUD API

假设b e S k + b你想克隆我在文章中运用的d e w M q b代码,以此查询它B w ] h 是怎样作业的。你能够运用下面的链c b x – w接在 GitHub 上查看。

源码链接 : h@ d j V W )ttps://github.com/Kailashw/deno-api-oak

假设发现译文存在过错或其他需求改: X W 2善的当地,欢迎到 掘金翻% 8 , _ 5 z译方案 对译文进行批改并 PR,也可获得相应奖励积分。文章开端的 本文永久链接 即为本文在 GitHub 上的 MarkDown 链接。


掘金翻译方案 是一个翻译优质互联网技术D r F 5 G s 0文章的社区,文章来历为 掘金 上的英文同享文章。内容覆盖 Android、iOS、前端、后端、区块链、产品、规划} & F G、人工智能等领域,想要查看更多优质译文请持续注重 掘金翻译方案、官方微博、知乎专a y o c栏。

发表评论

提供最优质的资源集合

立即查看 了解详情