了不起的 Deno 实战教程( 二 )

  • middlewares 目录: 存放中间件 , 用于处理每个请求;
  • models 目录: 存放模型定义 , 在我们的示例中只包含 Todo 接口;
  • services 目录: 存放服务层程序;
  • db 目录:作为本地数据库 , 存放 Todo 数据;
  • config.ts:包含应用的全局配置信息;
  • index.ts :应用的入口文件;
  • routing.ts:包含 API 路由信息 。
  • 完成项目初始化之后 , todos 项目的目录结构如下所示:
    └── todos    ├── config.ts    ├── db    ├── handlers    ├── index.ts    ├── middlewares    ├── models    ├── routing.ts    └── services如你所见 , 这个目录结构看起来像一个小型 Node.js Web 应用程序 。下一步 , 我们来创建 Todo 项目的入口文件 。
    步骤二:创建入口文件index.ts
    import { Application } from "https://deno.land/x/oak/mod.ts";import { APP_HOST, APP_PORT } from "./config.ts";import router from "./routing.ts";import notFound from "./handlers/notFound.ts";import errorMiddleware from "./middlewares/error.ts";const app = new Application();app.use(errorMiddleware);app.use(router.routes());app.use(router.allowedMethods());app.use(notFound);console.log(`Listening on ${APP_PORT}...`);await app.listen(`${APP_HOST}:${APP_PORT}`);在第一行代码中 , 我们使用了 Deno 所提供的功能特性 , 即直接从网络上导入模块 。除此之外 , 这里没有什么特别的 。我们创建一个应用程序 , 添加中间件 , 路由 , 最后启动服务器 。整个流程就像开发普通的 Express/Koa 应用程序一样 。
    步骤三:创建配置文件config.ts
    const env = Deno.env.toObject();export const APP_HOST = env.APP_HOST || "127.0.0.1";export const APP_PORT = env.APP_PORT || 3000;export const DB_PATH = env.DB_PATH || "./db/todos.json";【了不起的 Deno 实战教程】为了提高项目的灵活性 , 我们支持从环境中读取配置信息 , 同时我们也为每个配置项目提供了相应的默认值 。其中 Deno.env() 相当于Node.js 平台中的 process.env 。
    步骤四:添加 Todo 模型models/todo.ts
    export interface Todo {  id: number;  userId: number;  title: string;  completed: boolean;}在 Todo 模型中 , 我们定义了 id、userId、title 和 completed 四个属性 , 分别表示 todo 编号、用户编号、todo 标题和 todo 完成状态 。
    步骤五:添加路由routing.ts
    import { Router } from "https://deno.land/x/oak/mod.ts";import getTodos from "./handlers/getTodos.ts";import getTodoDetail from "./handlers/getTodoDetail.ts";import createTodo from "./handlers/createTodo.ts";import updateTodo from "./handlers/updateTodo.ts";import deleteTodo from "./handlers/deleteTodo.ts";const router = new Router();router  .get("/todos", getTodos)  .get("/todos/:id", getTodoDetail)  .post("/todos", createTodo)  .put("/todos/:id", updateTodo)  .delete("/todos/:id", deleteTodo);export default router;同样 , 没有什么特别的 , 我们创建一个 router 并添加 routes 。它看起来几乎与 Express.js 应用程序一模一样 。
    步骤六:添加路由处理器handlers/getTodos.ts
    import { Response } from "https://deno.land/x/oak/mod.ts";import { getTodos } from "../services/todos.ts";export default async ({ response }: { response: Response }) => {  response.body = await getTodos();};getTodos 处理器用于返回所有的 Todo 。如果你从未使用过 Koa , 则 response 对象类似于 Express 中的 res 对象 。在 Express 应用中我们会调用 res 对象的 json 或 send 方法来返回响应 。而在 Koa/Oak 中 , 我们需要将响应值赋给 response.body 属性 。


    推荐阅读