deno虽然只出了一个demo,但异常火爆!我怎么能落后?
deno 特性
我说的没有别人的好,看看别人的:
-
deno手册: nugine.github.io/deno-manual…
-
deno官网:deno.land/
-
denoAPI: doc.deno.land/https/githu…
-
deno.land/:deno.land/x
开始CRUD
本文主要根据Deno server 中间件:deno.land/x/oak完成,所以先通读这个文档,才是正确的做法。
模拟存储层
新建一个book.json
作为数据的存储
[
{
"id": 1,
"name": "JavaScript 高级编程指南",
"author": "大佬"
},
{
"id": 3,
"name": "3天精通JavaScript",
"author": "大忽悠"
}
]
操作JSON文件
读取json文件:
const getAllBook = () => {
const decoder = new TextDecoder("utf-8")
const data = Deno.readFileSync("../book.json")
const books = decoder.decode(data)
return books
}
操作josn文件:
const addBook = (book: any) => {
const allBook = JSON.parse(getAllBook())
allBook.push(book)
const encoder = new TextEncoder()
Deno.writeFileSync("../book.json", encoder.encode(JSON.stringify(allBook)))
}
尝试写一个查询
先看看文档怎么做的:
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const books = new Map<string, any>();
books.set("1", {
id: "1",
title: "The Hound of the Baskervilles",
author: "Conan Doyle, Author",
});
const router = new Router();
router
.get("/book", (context) => {
context.response.body = Array.from(books.values());
})
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8000 });
首先引入中间件Router
,使用两个中间件的方法app.use(router.routes()); app.use(router.allowedMethods());
,而router
的用法也很简单,首先实例化const router = new Router();
,再通过get()
方法对请求路由进行监听。
废话不多说,直接模仿:
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const getAllBook = () => {
const decoder = new TextDecoder("utf-8")
const data = Deno.readFileSync("../book.json")
const books = decoder.decode(data)
return books
}
const router = new Router();
router
.get("/book", (context: any) => {
context.response.body = getAllBook();
})
const app = new Application();
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8002 });
使用deno run --allow-write --allow-read --allow-net --allow-env index.ts
进行编译,其中--allow-xxxx
表示赋予程序权限。
但是,编译失败!经过各种查询,原来是deno版本的问题,使用deno upgrade
进行升级。再重新尝试。
访问localhost:8002
,页面有结果显示。
试着RUD
const getBook = (id: number) => {
const allBook = JSON.parse(getAllBook())
for(const book of allBook) {
if (book.id == id) {
const encoder = new TextEncoder()
return encoder.encode(JSON.stringify(book))
}
}
return false
}
const deleteBook = (id: number) => {
const allBook = JSON.parse(getAllBook())
for (let index =0; index< allBook.length; index++) {
if (allBook[index].id == id) {
allBook.splice(index, 1, 0)
}
}
const encoder = new TextEncoder()
Deno.writeFileSync("../book.json", encoder.encode(JSON.stringify(allBook)))
}
router
.delete('/deleteBook/:id', (context: any) => {
if (getBook(context.params.id)) {
context.response.status = 200
console.log(123)
deleteBook(context.params.id)
context.response.body = '删除成功'
} else {
context.response.status = 404
context.response.body = 'not found the id'
}
})
在https://getman.cn/#
在进行模拟请求,如果不出意外,会出现跨域错误,查看文档,发现有header相关配置,我们这样进行跨域配置:
app.use(async (ctx: any, next: any) => {
ctx.response.headers.set("Access-Control-Allow-Origin", "*");
ctx.response.headers.set("Access-Control-Allow-Methods", "*");
await next();
});
下面是一份完整的demo代码
import { Application, Router } from "https://deno.land/x/oak/mod.ts";
const getAllBook = () => {
const decoder = new TextDecoder("utf-8")
const data = Deno.readFileSync("../book.json")
const books = decoder.decode(data)
return books
}
const getBook = (id: number) => {
const allBook = JSON.parse(getAllBook())
for(const book of allBook) {
if (book.id == id) {
const encoder = new TextEncoder()
return encoder.encode(JSON.stringify(book))
}
}
return false
}
const addBook = (book: any) => {
const allBook = JSON.parse(getAllBook())
allBook.push(book)
const encoder = new TextEncoder()
Deno.writeFileSync("../book.json", encoder.encode(JSON.stringify(allBook)))
}
const updataBook = (book: any) => {
const allBook = JSON.parse(getAllBook())
allBook[book['id']] = book
const encoder = new TextEncoder()
Deno.writeFileSync("../book.json", encoder.encode(JSON.stringify(allBook)))
}
const deleteBook = (id: number) => {
const allBook = JSON.parse(getAllBook())
for (let index =0; index< allBook.length; index++) {
if (allBook[index].id == id) {
allBook.splice(index, 1, 0)
}
}
const encoder = new TextEncoder()
Deno.writeFileSync("../book.json", encoder.encode(JSON.stringify(allBook)))
}
const router = new Router();
router
.get("/", (context: any) => {
context.response.body = "Hello world!";
})
.get("/book", (context: any) => {
context.response.body = getAllBook();
})
.get("/book/:id", (context: any) => {
if (getBook(context.params.id)) {
context.response.body = getBook(context.params.id)
} else {
context.response.status = 404
context.response.body = 'not found the id'
}
})
.delete('/deleteBook/:id', (context: any) => {
console.log(789)
if (getBook(context.params.id)) {
context.response.status = 200
console.log(123)
deleteBook(context.params.id)
context.response.body = '删除成功'
} else {
context.response.status = 404
context.response.body = 'not found the id'
}
})
.post('/postBook', (context: any) => {
console.log('context---', context)
addBook({"id":145,"name":"JavaScript 高级编程指南","author":"大佬"})
context.response.body = "增加成功"
context.response.status = 201
})
.put('/putBook', (context: any) => {
console.log('context---', context)
updataBook({"id":145,"name":"JavaScript 高级编程指南","author":"大佬 2号"})
context.response.body = "修改成功"
context.response.status = 200
})
const app = new Application();
app.use(async (ctx: any, next: any) => {
ctx.response.headers.set("Access-Control-Allow-Origin", "*");
ctx.response.headers.set("Access-Control-Allow-Methods", "*");
await next();
});
app.use(router.routes());
app.use(router.allowedMethods());
await app.listen({ port: 8002 });
// deno run --allow-write --allow-read --allow-net --allow-env index.ts