使用Koa2进行Web开发(二)静态文件与路由

2023-11-17

静态文件处理

这里选择koa-static作为处理静态文件的中间件

const Koa = require('koa');
const app = new Koa();
const  serve = require("koa-static");
app.use(serve(__dirname+ "/static/html",{ extensions: ['html']}));
app.listen(3000);

static模块的使用也比较简单,规划好静态文件存放的路径,使用app.use挂载在应用上即可。
上面的代码中,__dirname+ “/static/html” 表示静态文件存放的路径,当接收到请求后,会在该路径下进行查找,serve还可以接收一个对象,表示查找文件的后缀名。

路由处理

在express中,路由处理的中间件是绑定在内部的,因此可以使用如下的代码

app.get(“/”,function(req,res){
    //TODO
})

在KOA中,由于移除了不必要的中间件,路由的处理同样要借助第三方模块来实现,这里使用koa-router
和express中注册路由的写法相同,router对象分别使用get和post方法来处理get和post请求。

下面是一个使用koa-router的例子

var Koa = require('koa');
var bodyParser = require('koa-bodyparser');
const router = require('koa-router')();
var app = new Koa();
app.use(bodyParser());
app.use(router.routes());
router.get('/', async (ctx, next) => {
    ctx.response.body = 
       '<h1>Index</h1> <form action="/login" method="post"> ' 
        +
        '<p>Name: <input name="name"></p>' 
        +
        ' <p>Password: <input name="password" type="password"></p> ' 
        +
        '<p><input type="submit" value="Submit"></p>' 
        +
        ' </form>';
});

router.post('/login', async (ctx, next) => {
    let
        name = ctx.request.body.name || '',
        password = ctx.request.body.password || '';

    console.log(ctx.request);
    if (name === 'koa' && password === '12345') {
        ctx.body = "Success"
    } else {
        ctx.body = "Login error"

    }
});

上面的代码中,我们定义了两个路由,接收到get请求后向前端渲染一个form表单用于登陆,当用户点击submit提交后,router接收到post请求后使用ctx.request.body
对象来解析表单中的字段,但实际上将post的请求打印出来
console.log(ctx.request);
会发现resquest对象并没有body这一字段,思考post请求的原理即可明白,由于表单提交可能划分为多个包进行传输,因此放在request对象中显然是不合理的,程序可以使用ctx.request.body来解析表单字段,是因为使用了koa-bodyparser这一模块的原因,至于该模块内部是如何实现的,读者可以自行参阅源码

{ method: ‘POST’,
url: ‘/login’,
host:{
‘localhost:3000’,
connection: ‘keep-alive’,
‘content-length’: ‘29’,
‘cache-control’: ‘max-age=0’,
origin: ‘http://localhost:3000‘,
‘upgrade-insecure-requests’: ‘1’,
‘user-agent’: ‘Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133
Safari/537.36’,
‘content-type’: ‘application/x-www-form-urlencoded’,
accept: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8’,
referer: ‘http://localhost:3000/login‘,
‘accept-encoding’: ‘gzip, deflate, br’,
‘accept-language’: ‘zh-CN,zh;q=0.8,en;q=0.6,ja;q=0.4’,
cookie: ‘_ga=GA1.1.910420953.1491570843’ } }

因为router也是中间件,因此要使用app.use()来挂在app对象中,值得注意的是,bodypaser要在router之前加载才能生效。

koa-router同样支持定义定义多种形式的路由,下面是官网的例子

router.get('/:category/:title', function (ctx, next) {
  console.log(ctx.params);
  // => { category: 'programming', title: 'how-to-node' }
});
router.get(/^\/(.*)(?:\/|$)/, ...);
 // match all path, e.g., /hello, /hello/world
router.get(/^\/app(?:\/|$)/, ...); 
// match all path that start with "/app", e.g., /app/hello, /app/hello/world

在上面的代码中:category和:title实际上起到了get参数的作用,这种restful风格的地址传递相比使用?category=.. &title=的形式更加简洁,要获取这种形式的参数,可以使用ctx.params对象。

router.get("/delete/blog/:blogId",async(ctx,next)=>{
    await  dbAPI.deleteBlogId(ctx.params.blogId);
    await next()
})
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Koa2进行Web开发(二)静态文件与路由 的相关文章

  • Node.js 中的 Azure Function 和共享文件

    我正在通过 Bitbucket CI 部署我的 Azure Functions 我可以在多个函数中引用共享目录中的文件 这很棒 但是 当我尝试更新我的共享代码并通过推送到主分支来部署它时 我可以看到文件在我的 Kudu 控制台中更新 但我的
  • 为什么发送 fetch() 时我的响应数据未定义?

    我正在尝试在客户端使用 fetch 将数据发布到我的 NodeJS 服务器或从我的 NodeJS 服务器发布数据 服务器很好地收到了 post 请求 我能够记录 req 变量 但是当我 res send any data 时 客户端无法检测
  • mocha——手表和猫鼬模型

    如果我让 mocha 监视更改 每次保存文件时 mongoose 都会抛出以下错误 OverwriteModelError 无法覆盖Client模型一旦编译 我知道猫鼬不允许两次定义模型 但我不知道如何让它与mocha watch clie
  • 将文件从一个文件夹移动到 s3 中的另一个文件夹

    首先 我尝试将文件复制到其他文件夹中 但无法删除它 仅当文件复制到目标文件夹时 如何才能删除该文件 const s3Params Bucket bucket CopySource bucket objectkey Key processed
  • 如何使用 lodash、underscore 或 bluebird 同步迭代数组 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我有一个数组 其中每个索引处包含文件名 我想下载这些文件一次一个 同步 我知道关于 Async 模块 但我想知道是否有任何功能Lodash
  • 如何使用 Passport-saml 向 TestShib IdP 提供 SP 元数据?

    我有一个node js脚本 使用护照 saml https www npmjs com package passport saml 模拟 SP 我的目标是将其连接到此TestShib IdP https idp testshib org i
  • 如何在 docker 容器中仅设置 python 2.7?

    我有节点应用程序 在一个用例中 我使用以下命令从节点调用 python 脚本python shell https www npmjs com package python shell 我正在尝试在 docker 上设置这个应用程序 我的 D
  • Express+jade:局部变量在视图中不可用

    我遇到了一个非常基本的问题 但我似乎找不到答案 我正在与node js express我只是想将局部变量传递到视图中 如下所示 app get function req res res render index locals title B
  • i18Next - NodeJS - 如何在不重新加载服务器的情况下更改翻译

    我正在使用 NodeJS 的 i18next 包来启用翻译 我将它作为标准 并为每个语言 国家对使用一个 json 文件 我想构建一个管理页面来编辑翻译 而无需深入研究代码 那么 如何 重新加载 管理员编辑过的 json 文件 而无需重新启
  • 将 Docker 与具有 Node-gyp 依赖项的 Nodejs 一起使用

    我计划使用 Docker 部署 node js 应用程序 该应用程序有几个需要node gyp的依赖项 Node gyp 根据交付平台上的编译库构建这些模块 例如 canvas lwip qrcode 根据我的经验 这些构建可能高度依赖于操
  • Nodejs 异步 Promise 队列

    我需要使用速率受限的 API 例如 我一秒钟只能进行 10 个 API 调用 因此我需要等待当前秒结束才能进行另一个 API 调用 为了实现这一目标 我想创建一个可以自行管理的异步队列 它的主要功能是让我向队列添加一个新的 Promise
  • 带回调或异步/等待的节点 postgres 事务?

    我正在运行 Node 7 6 0 它支持 async await node postgres 客户端池支持 async await 并且有一个很好的示例here https github com brianc node pg pool pl
  • 使用 Connect 和 node-http-proxy 的 HTTP 代理

    在开发过程中 我需要一个 HTTP 代理来访问外部 API 以绕过跨域安全限制 我在这里找到了一些示例代码 http nthloop com blog local dev with nodejs proxy http nthloop com
  • 运行 pm2 记录错误 SyntaxError: Unexpected token

    我想查看我的项目的日志 Steps 我克隆了一个套接字应用程序 然后我跑npm install pm2 g安装pm2 I run pm2 start 有用 它显示我的套接字应用程序的表格 但如果我跑pm2 logs查看日志 存在这样的错误
  • 弹出表单可见,但 Puppeteer 中缺少 html 代码

    我目前正在尝试从网站获取一些信息 https www bauhaus info https www bauhaus info 并在 cookie 弹出表单中失败 到目前为止 这是我的代码 async gt const browser awa
  • Mongoose 对 Promise 拒绝处理

    我有点与 NodeJS 中的 Promise 模式作斗争 我正在数据库中查找用户 然后使用用户引用保存新实体 但是当用户不在数据库中时 我应该返回拒绝 但我不确定如何正确执行 有没有办法做得更好 顺便说一句 对不起 咖啡脚本 User fi
  • libicui18n.so.52:无法打开共享对象文件

    我一直在使用 libicu 来检测在 docker ubuntu 内部运行的节点应用程序中的字符集 这是通过模块完成的节点 icu 字符集检测器 https github com mooz node icu charset detector
  • 令牌中不存在必需的声明 nbf(使用 Firebase Microsoft Sign In 尝试访问 Microsoft Graph)

    我目前有一个具有以下结构的应用程序 Angular 前端 Node js 服务器 我们已实施 Google Cloud 的身份提供商以使用 Google 和 或 Microsoft 进行登录 Google 登录并访问 Google Clou
  • ExpressJS - 提供通用 Nuxt 应用程序和 AngularJS SPA

    我有一个具有以下结构的博客项目 服务器 用 Node Express 编写 管理员 AngularJS SPA public AngularJS SPA 目前 管理部分和公共部分具有相同的域 但管理部分使用不同的子域 这允许我在 Expre
  • 节点项目的 Azure git 部署失败

    我正在尝试将我的项目部署到azure 它正在失败 这些是我采取的步骤 git init git config core longpaths true git add git commit m initial commit 所有这些都有效 我

随机推荐

  • 使用boost库来计算文件夹的大小

    include
  • 投资学实务 期货日志及实践总结

    我的期货交易可以分为三个阶段 摸索阶段9 27 9 30 日期 单日净盈利 累计净值 单日回撤 9 27 14370 0 9707 0 03 9 28 29670 1 0295 0 9 29 11855 1 0517 0 9 30 1647
  • Acwing-27. 数值的整数次方

    由于本题的指数是int范围 可能很大 所以需要用快速幂 Acwing 875 快速幂 中有详细介绍快速幂 点击链接即可传送 求解 https blog csdn net weixin 43844521 article details 127
  • torch.cat过程中遇到的问题

    项目场景 有关深度强化学习过程中使用torch cat遇到的问题 问题描述 在学习MEC 使用深度强化学习改变卸载率的过程中 要将action和state通过torch cat合并的时候遇到的问题 第一个问题 torch cat当中直接使用
  • 在Vim(gvim)中使用cscope

    之前已经详细的介绍了在vim中使用ctags 这篇文章我们就来详细介绍一下如何在vim中使用cscope 首先 我们还是了解一下什么是cscope 简单来讲 cscope主要用来协助浏览C C 语言 他的功能要强大于ctags 不仅支持变量
  • python基础--除法、地板除、取余

    在Python中 有两种除法 一种除法是 gt gt gt 10 3 3 3333333333333335 除法计算结果是浮点数 即使是两个整数恰好整除 结果也是浮点数 gt gt gt 9 3 3 0 还有一种除法是 称为地板除 两个整数
  • libevent涉及的知识积累

    O 1 实现单链表插入删除 阅读libevent源码时发现了linux提供的一个链表 宏定义如下 define LIST ENTRY type struct struct type le next next element struct t
  • msvcp140.dll丢失的解决方法,win10系统dll报错的解决方法

    今天 我将为大家分享一个关于msvcp140 dll丢失的解决方法 特别是针对在Windows 10系统上遇到这个问题的朋友们 在开始之前 我想先简要介绍一下msvcp140 dll文件的作用 msvcp140 dll是Microsoft
  • linux怎么修改目录的所有者,linux修改文件或目录的所有者(chown)和用户组

    chown更改文件或目录的所有者 注意 所有者 必须存在于 etc passwd 下 比如 linux修改文件或目录的所有者 chown 和用户组 更改文件或目录的所有者命令 1 新建测试文件test 命令为 touch test 2 查看
  • 由于找不到msvcp140.dll无法继续执行代码”问题的解决方法

    DLL文件对于Windows上的应用程序至关重要 因为这些文件在运行时是必需的 如果没有这些文件 或者它们已经损坏 相应的应用程序可能会变得不稳定 或者根本无法运行 现在 让我们一起探讨 由于找不到msvcp140 dll无法继续执行代码
  • html提示框延时消失,JS实现提示效果弹出及延迟隐藏的功能

    自动登录勾选提示效果 要求 鼠标移入显示提示信息框 鼠标离开 信息框消失 消失的效果延迟Document sign display inline block width 15px height 15px border 1px solid c
  • 小白的高德地图初体验(一) —— 打点

    小白的高德地图初体验 一 打点 说到高德地图 肯定要推荐官方文档 传送门 走你 小白的高德地图初体验 一 打点 小白的高德地图初体验 二 点聚合 小白的高德地图初体验 三 轨迹 小白的高德地图初体验 四 矢量图形 小白的高德地图初体验 五
  • NetBeans下载安装

    1 下载 网址 Apache NetBeans Releases 2 安装 执行exe 选择安装目录和jdk
  • qemu搭建和运行起来一个linux内核环境

    qemu搭建和运行起来一个linux内核环境 参考了博客 搭建linux调试环境 一 qemu环境搭建vexpress开发平台 Edver 博客园 嵌入式Linux之QEMU模拟器 4 使用busybox制作根文件系统 ReCclay的博客
  • 【数字图像处理】图像的几何变换

    文章目录 图像几何变换的一般思路 图像平移 图像镜像 图像转置 图像缩放 图像旋转 插值算法 最近邻插值 双线性插值 高阶插值 包含相同内容的两幅图像可能由于成像角度 透视关系乃至镜头自身原因所造成的几何失真而呈现截然不同的外观 通过适当的
  • 【类】二维dp:动态规划背包问题

    dp n m 含义就是 当有n种物品时且背包有m容量时 这个背包能产生的最大价值 状态转换关系是 dp n m dp n 1 m dp n 1 m 新物品重量 意思就是 当面对新来的一个物品时 求这个情况下 背包能产生的最大价值 相当于求下
  • GB/T 35273—2020《信息安全技术个人信息安全规范》正式发布

    GB T 35273 2020 信息安全技术个人信息安全规范 2020年3月6日 国家市场监督管理总局国家标准化管理委员会正式发布 GB T 35273 2020 信息安全技术个人信息安全规范 GB T 35273 2020 信息安全技术个
  • LeetCode 53 最大子序列和

    给定一个整数数组 nums 找到一个具有最大和的连续子数组 子数组最少包含一个元素 返回其最大和 示例 输入 2 1 3 4 1 2 1 5 4 输出 6 解释 连续子数组 4 1 2 1 的和最大 为 6 进阶 如果你已经实现复杂度为 O
  • Go 面试系列: Goroutine 数量是越多越好吗?设置多少会影响GC调度呢?

    Go 面试系列 Goroutine 数量是越多越好吗 设置多少会影响GC调度呢 前言 现在的大厂都开始慢慢使用Go语言了 例如字节已经把Go作为后端开发的主要编程语言 但是Go的面试题总结的比较少 于是打算开启这个专栏 一起学习一起进步 前
  • 使用Koa2进行Web开发(二)静态文件与路由

    静态文件处理 这里选择koa static作为处理静态文件的中间件 const Koa require koa const app new Koa const serve require koa static app use serve d