什么是 Deno?
Deno 是一个由 Ryan Dahl 创造的新型后端运行时。Deno 旨在解决 Node.js 的一些设计缺陷,例如模块加载、安全性和构建工具等问题。Deno 使用 V8 引擎和 Rust 编写一些底层模块,同时支持 TypeScript,可以轻松编写类型安全的应用程序。相比于 Node.js,Deno 有很多新特性,例如:
- 自带 TypeScript 支持
- 没有使用 npm,而是使用 URL 式的模块导入
- 集成了多进程、多线程等高级特性
- 内置有安全沙箱机制
如何构建一个简单的社交网络应用?
在这篇文章中,我们将使用 Deno 构建一个简单的社交网络应用,该应用支持用户注册、登录、发布动态、浏览动态等功能。我们将使用 Oak 作为我们的 Web 框架,使用 MongoDB 作为我们的数据库。
首先,我们需要创建我们的项目文件夹并初始化 Deno 项目:
mkdir deno-social-network cd deno-social-network deno init --typscript
接着,我们需要安装一些必要的依赖:
deno install --allow-net --allow-read --allow-env deno.land/x/denon@2.0.0
这里我们使用 denon 来运行我们的应用程序,它类似于 Node.js 中的 nodemon,可以在文件改动时重新启动应用程序。
接下来,我们需要安装一些必要的依赖:
deno install --allow-net --allow-read --allow-env deno.land/x/denon@2.0.0
这里我们使用 denon 来运行我们的应用程序,它类似于 Node.js 中的 nodemon,可以在文件改动时重新启动应用程序。
接下来我们需要安装一些依赖:
# Oak 是 Deno 上的一个 Web 框架 deno install --allow-net --allow-read --allow-env https://deno.land/x/oak/mod.ts # 我们使用 MongoDB 作为数据库 deno install --allow-net --allow-read --allow-env https://deno.land/x/mongo/mod.ts
接着,我们来创建我们的应用程序。我们先在根目录下创建一个名为 app.ts 的文件,并添加以下内容:
// javascriptcn.com 代码示例 import { Application } from "https://deno.land/x/oak/mod.ts"; const app = new Application(); app.use((ctx) => { ctx.response.body = "Hello, Deno!"; }); await app.listen({ port: 8000 });
然后,我们需要在 denon.json 中配置 denon 来运行我们的应用程序。我们在根目录下创建一个名为 denon.json 的文件,并添加以下内容:
{ "scripts": { "start": { "cmd": "deno run --allow-net --allow-read app.ts", "watch": true } } }
现在我们可以使用 denon 来启动我们的应用程序了:
denon start
现在,我们可以在浏览器中输入 http://localhost:8000
来访问我们的应用程序了,应该可以看到 "Hello, Deno!" 这个页面。接下来,我们来创建我们的路由器。
我们在根目录下创建一个名为 router.ts 的文件,并添加以下内容:
// javascriptcn.com 代码示例 import { Router } from "https://deno.land/x/oak/mod.ts"; const router = new Router(); router.get("/", (ctx) => { ctx.response.body = "Hello, Deno!"; }); export default router;
然后我们在 app.ts 中使用这个路由器:
// javascriptcn.com 代码示例 import { Application } from "https://deno.land/x/oak/mod.ts"; import router from "./router.ts"; const app = new Application(); app.use(router.routes()); app.use(router.allowedMethods()); await app.listen({ port: 8000 });
现在我们可以在浏览器中输入 http://localhost:8000
来访问我们的应用程序了,应该可以看到 "Hello, Deno!" 这个页面。但这仅仅是一个演示,我们的目标是搭建一个简单的社交网络应用。现在,我们开始完善我们的应用程序。
我们需要先创建一些必要的接口来处理用户登录和注册,我们在根目录下创建一个名为 auth.ts 的文件,并添加以下内容:
// javascriptcn.com 代码示例 import { MongoClient } from "https://deno.land/x/mongo/mod.ts"; const client = new MongoClient(); await client.connect("mongodb://localhost:27017"); const db = client.database("deno-social-network"); const users = db.collection("users"); export interface RegisterBody { username: string; password: string; } export interface LoginBody { username: string; password: string; } export async function register({ username, password }: RegisterBody) { const existingUser = await users.findOne({ username }); if (existingUser) { throw new Error("User already exists"); } const passwordHash = await bcrypt.hash(password, 8); const user = await users.insertOne({ username, password: passwordHash, }); return user; } export async function login({ username, password }: LoginBody) { const user = await users.findOne({ username }); if (!user) { throw new Error("User not found"); } const passwordMatch = await bcrypt.compare(password, user.password); if (!passwordMatch) { throw new Error("Invalid password"); } return user; }
这里我们使用了 MongoDB 作为我们的数据库,并使用 bcrypt 来哈希密码。我们现在可以在我们的应用程序中使用这些接口来处理用户的注册和登录了。
我们更新我们的路由器,并添加以下内容:
// javascriptcn.com 代码示例 import { Router } from "https://deno.land/x/oak/mod.ts"; import { register, login } from "./auth.ts"; const router = new Router(); router.post("/api/register", async (ctx) => { const body = await ctx.request.body(); const { username, password } = body.value; const user = await register({ username, password }); ctx.response.body = user; }); router.post("/api/login", async (ctx) => { const body = await ctx.request.body(); const { username, password } = body.value; const user = await login({ username, password }); ctx.response.body = user; }); export default router;
现在我们可以使用 POST 请求来注册用户和登录用户了。我们可以使用 Postman 或 curl 等工具来测试这些接口。例如,我们可以使用以下命令来测试注册接口:
curl -X POST -H "Content-Type: application/json" -d '{"username":"testuser","password":"testpassword"}' http://localhost:8000/api/register
接下来,我们添加动态模型,并使用它来处理用户的动态发布。我们在根目录下创建一个名为 post.ts 的文件,并添加以下内容:
// javascriptcn.com 代码示例 import { MongoClient } from "https://deno.land/x/mongo/mod.ts"; const client = new MongoClient(); await client.connect("mongodb://localhost:27017"); const db = client.database("deno-social-network"); const posts = db.collection("posts"); export interface Post { title: string; content: string; authorId: string; } export async function createPost({ title, content, authorId }: Post) { const post = await posts.insertOne({ title, content, authorId }); return post; } export async function getPosts() { const postsList = await posts.find(); return postsList.toArray(); }
我们更新我们的路由器,并添加以下代码来支持动态发布和浏览功能:
// javascriptcn.com 代码示例 import { Router } from "https://deno.land/x/oak/mod.ts"; import { register, login } from "./auth.ts"; import { createPost, getPosts } from "./post.ts"; const router = new Router(); router.post("/api/register", async (ctx) => { const body = await ctx.request.body(); const { username, password } = body.value; const user = await register({ username, password }); ctx.response.body = user; }); router.post("/api/login", async (ctx) => { const body = await ctx.request.body(); const { username, password } = body.value; const user = await login({ username, password }); ctx.response.body = user; }); router.post("/api/post", async (ctx) => { const body = await ctx.request.body(); const { title, content, authorId } = body.value; const post = await createPost({ title, content, authorId }); ctx.response.body = post; }); router.get("/api/posts", async (ctx) => { const postsList = await getPosts(); ctx.response.body = postsList; }); export default router;
我们现在可以使用 POST 请求来发布动态,并使用 GET 请求来获取所有动态。例如,我们可以使用以下命令来测试发布动态:
curl -X POST -H "Content-Type: application/json" -d '{"title":"testtitle","content":"testcontent","authorId":"testuser"}' http://localhost:8000/api/post
完成后,我们可以使用以下命令来测试浏览所有动态:
curl http://localhost:8000/api/posts
总结
在本文中,我们已经学习了如何使用 Deno、Oak 和 MongoDB 搭建一个简单的社交网络应用程序。我们实现了用户的注册、登录、发布动态和浏览动态等功能。我们了解了 Deno 的一些特性,例如集成 TypeScript、URL 式的模块导入、多进程、多线程等高级特性,以及内置的安全沙箱机制。我们再次提醒读者在使用此技术期间需遵循当地法律法规,并注意网络安全。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65864b7ad2f5e1655d0ab28a