Deno

  • Ryan Dahl开发
  • 基于Google V8引擎
    • 高新能、开发方便
  • 使用Rust语言开发
    • 安全性、新能高

Deno是什么?

其实就是Node的升级版(替代版),是node同一个作者开发的。作者为什么要开发Deno,这个因为作者认为node的发展已经偏离了自己最开始的初衷。

Deno特性

  • 原始支持TypeScript 和 JavaScript
  • 默认安全(node默认是开放的)
  • 去中心化包管理
    • 不再有向npm这样的中心化官方包管理网站。
    • 也就是每一个人把自己的包放在自己的服务器上。
    • 特点(安全性比较低,因为个人网站确实容易遭受攻击)。
  • 丰富的标准库
  • 现代JS特性
  • ES模块
  • 顶层await支持
  • 内置测试工具
  • 浏览器兼容API

Deno安全

  • 文件读/写
  • 网络访问
  • 环境访问
  • 插件
  • 高精度时间
  • 子进程

Deno包管理

  • 不再有npm、package.json
  • 每个包都有一个url地址(去中心化)
  • 包缓存
    • 不需要重复下载。

Deno标准库

  • Deno拥有一套完整的标准库
    • fs
    • datetime
    • http
    • 其他

Deno安装

  • window安装
iwr https://deno.land/x/install/install.ps1 -useb | iex
  • 查看是否安装成功
deno -v
  • 安装运行
deno run index.ts

Deno使用

  • Deno权限设置

Deno默认安全所以你需要给他一定的权限

-awllow
  • Deno引入
import { dayOfYear } from "https://deno.land/std@0.83.0/datetime/mod.ts";

console.log(dayOfYear(new Date('2021-01-10')));
  • Deno创建文件
const encoder = new TextEncoder();

const greetText = encoder.encode("Hellow word");


await Deno.writeFile('greet.txt',greetText);
 deno run --allow-write createFile.ts
  • Deno读取文件
let file = await Deno.open('greet.txt');

await Deno.copy(file,Deno.stdout);

file.close();
deno run --allow-read readFile.ts

  • Deno创建服务
import {
    serve } from "https://deno.land/std@0.83.0/http/server.ts";
const server = serve({
    port: 8000 });
console.log("http://localhost:8000/");
for await (const req of server) {
   
  req.respond({
    body: "Hello World\n" });
}

deno run --allow-net simServer.ts 

Deno写接口

接口项目gitee地址

  • 创建入口文件server,ts
import {
   Application} from "https://deno.land/x/oak/mod.ts";
import router from "./routes.ts";

const port = 5000;

const app = new Application();


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



console.log(`运行端口`+ port);

await app.listen({
    port });

同级目录下创建routers.ts文件


import {
   Router} from "https://deno.land/x/oak/mod.ts";
import {
   getProducts,getProduct,addProduct,deleteProduct,updateProduct} from "./controllers/products.ts";

const router =new Router();

router.get('/api/v1/products',getProducts)
        .get('/api/v1/products/:id',getProduct)
        .post('/api/v1/products',addProduct)
        .delete('/api/v1/products/:id',deleteProduct)
        .put('/api/v1/products/:id',updateProduct)


export default router;

创建controllers文件夹,在其下面创建products.ts文件。

interface Product {
   
    id:string;
    name:string;
    price:number;
}

import {
   v4} from "https://deno.land/std/uuid/mod.ts";

let products : Product[] = [
    {
   
        id:"1",
        name:'产品一',
        price: 29.99,
    },
    {
   
        id:"2",
        name:'产品二',
        price: 29.99,
    },
    {
   
        id:"3",
        name:'产品三',
        price: 29.99,
    },
]

//@desc 获取产品
//@route GET /api/v1/products/:id
const getProducts = ({
   response} : {
   response :any}) => {
   
    response.body = {
   
        success:true,
        data: products
    }
}

//@desc 获取单个产品
//@route GET /api/v1/products/:id
const getProduct = ({
    params, response} : {
    params:{
   id:string }, response :any}) => {
   

    const product : Product | undefined = products.find(p => p.id === params.id);

    if(product){
   
        response.status = 200
        response.body = {
   
            success:true,
            data: product
        }
    }else{
   
        response.status = 404
        response.body = {
   
            success:false,
            data: "抱歉没有找到你需要的数据"
        }
    }


}


//@desc 添加单个产品
//@route POST /api/v1/products
const addProduct = async ({
   request , response} : {
   request :any , response :any}) => {
   

    const body = await request.body();

    if(!request.hasBody){
   
        response.status = 400
        response.body = {
   
            success:false,
            data: "没有数据"
        }
    }else{
   
        const product : Product = body.value;
        product.id = v4.generate();
        response.status = 201
        response.body = {
   
            success:true,
            data: product,
        }
    }


}


//@desc 更新单个产品
//@route GET /api/v1/products/:id
const updateProduct =async ({
   params , request, response} : {
   params:{
   id:string} ,request :any, response :any}) => {
   
    
    const product : Product | undefined = products.find(p => p.id === params.id);


    if(product){
   
        const body = await request.body();
        const updateData:{
   name?:string,price?:number} = body.value;

        products = products.map(p => p.id === params.id ?{
   ...p,...updateData} : p)

        response.status = 200
        response.body = {
   
            success:true,
            data: products
        }
    }else{
   
        response.status = 404
        response.body = {
   
            success:false,
            data: "抱歉没有该产品"
        }
    }
    

}


//@desc 删除单个产品
//@route DELETE /api/v1/products/:id
const deleteProduct = ({
   params,response} : {
   params:any , response :any}) => {
   

    products = products.filter(p => p.id !== params.id)

    response.body = {
   
        success:true,   
        data: "删除成功"
    }
}

export {
    getProducts ,getProduct ,addProduct,updateProduct,deleteProduct}

完成后在终端中输入代码即可。

deno run --allow-net server.ts