deno之CRUD

919 阅读3分钟

deno虽然只出了一个demo,但异常火爆!我怎么能落后?

deno 特性

我说的没有别人的好,看看别人的:

  1. deno手册: nugine.github.io/deno-manual…

  2. deno官网:deno.land/

  3. denoAPI: doc.deno.land/https/githu…

  4. 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