背景知识

HTTP Status Code 405

405 Method not allowed

The resource was requested using a method that is not allowed. For example, requesting a resource via a POST method when the resource only supports the GET method.

405 响应意味着这个路由存在,但是请求的方法不支持。

HTTP Response Header Allow

Valid actions for a specified resource. To be used for a 405 Method not allowed

Allow: GET, HEAD

HTTP 响应头 Allow 主要是配合 405 响应一起使用,用于告诉客户端此路由支持的 HTTP 方法。

起因

最近在使用 Expressjs 开发 Restful API,发现其内置没有对 HTTP 405 响应的支持,对于有路由但未定义的 相应 HTTP method 处理方法的请求其会响应 404 错误(express-generator 生成的代码默认行为是这样),这显然不利于我们排错,也不符合 HTTP 状态码的语义,所以我们可以为其增加 HTTP 响应 405 支持。

针对单个 router 的快速实现

对于某一个 router,我们可以简单地在路由处理方法最后增加一个方法来支持 405 响应,实现比较简单:

import { Router } from 'express'

const router = new Router()
const getAll = (req, res, next) => {}
const createNew = (req, res, next) => {} router.route('/resource')
.get(getAll)
.post(createNew)
.all(function support405Response (req, res, next) {
res.set('Allow', 'GEt, POST')
res.status(405).send('Method Not Allowed')
})

实现一个通用方案

router 的结构

为某一个 router 增加 405 响应支持很简单,但是若有很多个 router,每个都去手动撰写太麻烦了,最好是有个方法能自动包装。

可以将 router 打印出来,分析一下 router 的结构,这里以如下 router 定义为例:

// 省略无关代码...
const router = new Router() router.route('/')
.get(getAll)
.post(createNew) router.route('/:id')
.get(getOne)
.patch(updateOne)
.delete(deleteOne)

上面 router 的打印结果如下:

{
params: {},
_params: [],
caseSensitive: undefined,
mergeParams: undefined,
strict: undefined,
stack: [
Layer {
handle: [Function: bound dispatch],
name: 'bound dispatch',
params: undefined,
path: undefined,
keys: [],
regexp: /^\/?$/i,
route: [Route]
},
Layer {
handle: [Function: bound dispatch],
name: 'bound dispatch',
params: undefined,
path: undefined,
keys: [Array],
regexp: /^\/(?:([^\/]+?))\/?$/i,
route: [Route]
}
]
}

router.stack 下 layer 的 route

观察发现,stack 属性数组下每个 Layer 有不少信息,但有帮助的还是太少。再把每个 Layer 的 route 打印出来看看:

[
Route {
path: '/',
stack: [ [Layer], [Layer] ],
methods: { get: true, post: true }
},
Route {
path: '/:id',
stack: [ [Layer], [Layer], [Layer], [Layer], [Layer] ],
methods: { _all: true, get: true, patch: true, delete: true }
}
]

嗯嗯,这下有不少有用的可以直接使用的信息。开始着手实现一个通用的为所有 router 增加 405 响应的方法。

一个为所有 router 添加 405 响应的方法

export default function add405ResponseToRouter (router) {
const routes = router.stack.map(layer => layer.route) for (const route of routes) {
const {
path,
methods
} = route router.route(path)
.all(function methodNotAllowed (req, res, next) {
res.set('Allow', Object.keys(methods).filter(method => method !== '_all').map(method => method.toUpperCase()).join(', '))
res.status(405).send('Method Not Allowed')
})
} return router
}

用上面实现的这个方法去包装我们之前定义的 router,请求 /:id 的实际效果:


express 为所有路由添加 405 method not allowd 响应的更多相关文章

  1. express 框架之 路由与中间件

    1.  什么是router路径,什么是middleware? 我们输入www.baidu.com 来访问百度的主页,浏览器会自动转换为 http://www.baidu.com:80/(省略一些参数) ...

  2. express-18 路由

    简介 路由是网站或Web服务中最重要的一个方面:路由是将请求(由URL和HTTP方法指定)路由到处理它们的代码去的一种机制. 路由过去是基于文件的,这很简单,但不灵活. IA 是指内容的概念性组织.在 ...

  3. post 405 method not allowed

    HTTP 405 错误 – 方法不被允许 (Method not allowed) 介绍 HTTP 协议定义一些方法,以指明为获取客户端(如您的浏览器或我们的 CheckUpDown 机器人)所指定的 ...

  4. Express ( MiddleWare/中间件 路由 在 Express 中使用模板引擎 常用API

    A fast, un-opinionated, minimalist web framework for Node.js applications. In general, prefer simply ...

  5. WebApi HTTP Put 405 Method not allowed

    总结列表: 1. There is already an open DataReader associated with this Connection which must be closed fi ...

  6. VS IISExpress REST DELETE 405 Method Not Allowed

    [参考].net IIS MVC Rest api 跨域 PUT DELETE 404 无法使用问题解决方案 今日在使用泛型處理常式處理檔案上傳時,使用了 HTTP 動詞的 PUT.DELETE 進行 ...

  7. node.js中express的Router路由的使用

    express中的Router作用就是为了方便我们更好的根据路由去分模块.避免将所有路由都写在入口文件中. 一.简单的使用Router const express = require('express ...

  8. 【微信支付】分享一个失败的案例 跨域405(Method Not Allowed)问题 关于IM的一些思考与实践 基于WebSocketSharp 的IM 简单实现 【css3】旋转倒计时 【Html5】-- 塔台管制 H5情景意识 --飞机 谈谈转行

    [微信支付]分享一个失败的案例 2018-06-04 08:24 by stoneniqiu, 2744 阅读, 29 评论, 收藏, 编辑 这个项目是去年做的,开始客户还在推广,几个月后发现服务器已 ...

  9. 关于SVN的405错误Server sent unexpected return value (405 Method Not Allowed)的解决办法

    一大早上捣鼓项目提交的时候出现这个错误: svn:server sent unexpected return value 405 method not allowed 百度了很多解决办法都没有解决,看 ...

  10. 使用wcf服务捕捉到“POST http://yourIP/WCFService.svc 405 (Method Not Allowed) ”错误!

    在程序中使用了一个wcf服务,调试时无任何问题(win7 64位,iis6.1),发布到部门服务器上没有问题(server2008 64位),但是部署到实际服务器上时(server2008 iis6. ...

随机推荐

  1. PHP全栈开发(八):CSS Ⅳ 文本格式及字体

    文本系列属性主要是设置文本格式的,例如.... 颜色 body {color:red;} h1 {color:#00ff00;} p.ex {color:rgb(0,0,255); 可以设置文本的居中 ...

  2. PHP全栈开发(七):PHP与MySQL存储交互(1.连接、创建数据库;创建数据表)

    在Linux服务器中可以使用命令 mysqladmin -u root password beijing2007; 来修改MySQL的root用户的密码. 但是在我们自己安装了wampserver的电 ...

  3. 洛谷P1638 逛画展 (尺取法)

    尺取法的经典题目: 博览馆正在展出由世上最佳的 mm 位画家所画的图画. 游客在购买门票时必须说明两个数字,aa 和 bb,代表他要看展览中的第 aa 幅至第 bb 幅画(包含 a,ba,b)之间的所 ...

  4. mysql安装教程-window操作系统

    1.下载安装包(官网下载) 直达链接:https://dev.mysql.com/downloads/mysql/ 下载后放到指定目录下解压即可(给电脑新手忠告:注意不要放在C盘,养成好习惯,放C盘多 ...

  5. 齐博X1-栏目的调用2

    fun('sort@fathers',$fid,'cms')  获取上层多级栏目这样的,比如我们现在所属第三级栏目,现在可以利用这个函数获取第二级和第一级的栏目,当然自身也会被调用出来,所以此函数用的 ...

  6. 你真的会使用Typora吗?

    你真的会使用Typora吗? 标题 一级标题:# 空格+内容 二级标题:## 空格+内容 字体 加粗:内容两边各加两个*号 你真美! 斜体:内容两边各加一个*号 你真帅! 删除线:两边各加两个~号(波 ...

  7. 十二、Pod的NameSpace

    Pod 的 NameSpace 一.Pod 的 NameSpace 使用 kubectl 管理命名空间及其包含的资源相当简单.在这一节中,我们将演示一些最常见的命名空间操作,便于你开始有效地分割资源. ...

  8. 重新整理 .net core 实践篇 ———— linux上排查问题 [外篇]

    前言 简单介绍一下在排查问题.献给初学者. 该文的前置篇: https://www.cnblogs.com/aoximin/p/16838657.html 正文 什么是linux系统 linux 是基 ...

  9. SystemParametersInfo函数说明

    SystemParametersinfo 返回值:如果函数调用成功,返回值非零:如果函数调用失败,那么返回值为零.若想获取更多错误信息,请调用GetLastError函数. SystemParamet ...

  10. 还在用双层for循环吗?太慢了

    前情提要 我们在开发中经常碰到这样的场景,查出两个 list 集合数据,需要根据他们相同的某个属性为连接点,进行聚合.但是平时我们使用的时候关注过性能吗?下面让我们一起来看看它的表现如何. 来个例子 ...