前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >一杯喜茶的时间实战Deno:Deno+MongoDB(内含项目Demo链接)

一杯喜茶的时间实战Deno:Deno+MongoDB(内含项目Demo链接)

作者头像
JowayYoung
发布2020-05-28 15:49:06
9550
发布2020-05-28 15:49:06
举报
文章被收录于专栏:JowayYoung谈前端

自从「Deno1.0」发布以来,有关Deno的文章很多,大多数都是在讨论怎么安装DenoDeno有哪些特点Deno和Node有哪些异同Deno是不是Node的替代品等。咱们今天不讨论这些,毕竟Talk is cheap. Show me the code!亲自体验一把Deno开发带来的快感,用Deno搞一个“企业级”应用:deno-supermarket[1],难道不香吗?

Deno常见的一些坑

在实战之前,还是先来介绍几个我在刚接触Deno时遇到的小坑。

权限标志符位置的问题

我们都知道,Deno默认是安全的,就是导致了默认情况下是不允许访问网络、读写文件等。比如有个名为index.ts的文件内容如下:

代码语言:javascript
复制
import { serve } from "https://deno.land/std@0.50.0/http/server.ts";

const s = serve({ port: 8000 });
console.log("http://localhost:8000/");

for await (const req of s) {
 req.respond({ body: "Hello World\n" });
}

如果直接执行deno run index.ts,会报错:error: Uncaught PermissionDenied: network access to "0.0.0.0:8000", run again with the --allow-net flag

所以我们很自然的就会在启动命令的最后加上--allow-net,如下:

代码语言:javascript
复制
deno run index.ts --allow-net

但是,这样仍然会报错。查了资料才知道,--allow-net--allow-read之类的标志是不可以放到文件名后面的,必须紧跟在deno run后面,比如,如下才是正确的:

代码语言:javascript
复制
deno run --alow-net index.ts

为什么调换了位置就不行呢?issue上的回答是,如果--allow-net跟在文件名后面,是传给JS脚本而不是传给Deno。想了解更多可以看这个confused by order of cli option flags[2]。反正,记住一点就行:权限标志一定要跟在deno run后面!

因为我们前端同学大多数平时很少写后台,不太清楚安全的重要性,为了避免遇到各种权限问题,我建议平时在写一些练手项目时,直接用deno run -A来启用全部的权限。(「这只是方便调试,在生产环境中一定要慎用!」)

不稳定的API

因为实战过程中使用了Mongodb,所以需要引入Deno的第三方模块mongo[3],然而在启动项目会报错:error: TS2339 [ERROR]: Property 'openPlugin' does not exist on type 'typeof Deno'.

查了一下,发现是因为openPlugin这个方法目前还不稳定。默认情况下,Deno只会提供稳定的API。如果需要开启不稳定API,可以添加--stable标志。比如:

代码语言:javascript
复制
deno run -A --unstable index.ts

可能有人会问,-A--unstable的位置调换会不会有问题。这个亲测过不会有问题。只要标志符在文件名称之前就行了。

还有个问题,到底哪些是稳定API,哪些是不稳定API呢?其实Deno官方文档已经帮我们分好类的了,入口地址分别是:

  • 稳定的API文档[4]
  • 不稳定的API文档[5]

如果你怀疑--unstable的作用,可以使用下面的方法打印出Deno上的所有成员:

代码语言:javascript
复制
console.log(Object.keys(Deno).length);

使用deno run --unstable index.ts输出的结果是117,使用deno run index.ts输出的结果是88。说明稳定的API有88个,不稳定的有29个。

Deno的一些使用技巧

从Node切换到Deno,我们的开发思维也要随之转变。所以,我们再来看看Deno的一些和Node不一样的开发技巧。

如何管理版本

刚开始我也很疑惑:没有了package.json,那怎么控制各依赖的版本呀?比如,我们有10个文件都依赖了mongo@0.0.6,那每个文件都使用以下代码进行引入:

代码语言:javascript
复制
import { init, MongoClient } from "https://deno.land/x/mongo@v0.6.0/mod.ts";

可是有一天,我突然想把0.6.0升级到0.7.0,那怎么办呢?一个个文件的进行替换容易漏掉,当然也可以全局搜索批量替换。但是这种效率都不是很高。

官方给出的推荐做法是,使用deps.ts文件来引入远程文件,并管理版本。当然,文件名称不一定叫做deps.ts, 你也可以改成其他的名称。具体做法就是,把所有用到的远程依赖,都在deps.ts中引入,并且通过Re-export手段导出各依赖,然后其他文件就可以从deps.ts中拿到所需要的依赖了。

回到刚才说10个文件都依赖到mongo的问题,如果改成deps.ts文件来统一管理是这样的:

代码语言:javascript
复制
export * from "https://deno.land/x/mongo@v0.6.0/mod.ts";

然后那些需要用到 mongo 的文件,不要直接从远程引入,而是从deps.ts中引入,如下:

代码语言:javascript
复制
import { init, MongoClient } from "../pathTo/deps.ts";

如果需要升级的话,我们可以直接把deps.ts里面的mongo地址中的0.6.0改成0.7.0就行了。

另外,有一点和npm类似的是,如果没有指定版本号,即远程地址中没有指定版本,比如:

代码语言:javascript
复制
export * from "https://deno.land/x/mongo/mod.ts";

就会默认安装最新版的依赖。

如何查找一些对我有用的Deno库

使用Node,可以到npm上查找一些库。Deno也有类似的平台,目前分为两种库,一种是官方标准的,另外一种是第三方的。标准库可以到这里查找:Deno Standard Modules[6]。第三方库可以到这里查找:Deno Third Party Modules[7]。

实战:使用Deno开发一个具备增删查改的商城系统

OK,具备以上的知识点,现在可以实战了。首先,需要保证你的电脑安装了Deno1.0。另外,由于用到了Mongodb,所以需要你的电脑也要安装Mongodb

界面

先来看看我们的商城的界面:

麻雀虽小五脏俱全哈!具备添加商品、查询商品、删除商品、修改商品的功能。这是典型的「REST API」风格的系统。

项目结构

然后再来看看项目结构:

  • 「.deno_plugins」:这是mongo模块所下载的动态链接库,不用关注它
  • 「congig/db.ts」:这是连接Mongodb的相关配置文件。目前写死的端口号是27017,如果你的Mongodb端口不是这个,可以在这个文件里面修改
  • 「controllers/goods.ts」:这是实现增删查改的逻辑代码
  • 「public/index.html」:这是前端静态页面,跟Deno无关的,我们只需要用Deno来服务该目录就行
  • 「deps.ts」:用来管理远程依赖库,然后Re-export出去给其他文件使用
  • 「server.ts」:入口文件,跟我们用expresskoa时的入口文件app.js类似
依赖模块的选择

因为该项目涉及到了前后端,如果使用Node的话,一般会选择expresskoa。同样的,我们使用Deno也要选择对应的框架,不然http服务以及路由跳转等都不是那么容易处理的。Deno上的这类框架,比较多人star的是oak[8]和abc[9],这里我们选择使用abc

另外,因为使用Mongodb,所以还需要引入mongo[10]。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IQ前端 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Deno常见的一些坑
    • 权限标志符位置的问题
      • 不稳定的API
      • Deno的一些使用技巧
        • 如何管理版本
          • 如何查找一些对我有用的Deno库
          • 实战:使用Deno开发一个具备增删查改的商城系统
            • 界面
              • 项目结构
                • 依赖模块的选择
                相关产品与服务
                数据库
                云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
                领券
                问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档