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写接口
- 创建入口文件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