今天遇到一个很严重的bug,原因是我对一个老接口进行重实现,老的服务就不需要了,这样做到资源最大化利用,但是老的服务是nginx层直接处理,没有区分请求方式,所有请求方式都支持,默认是使用了get方式,并且支持jsonp,一般情况下支持jsonp的请求都是get请求,但是客户端接入的时候使用了post方式,而新的服务是只做了支持了get方式,导致上线之后大量报错。
虽然老接口的实现很奇葩,但是已经有很多项目在使用了,让每个项目都修改是不可能的,只能新的服务支持所有的请求方式。
那么问题来了,node中怎么忽略请求方式呢,匹配所有请求方式的请求呢?
新的服务是koa项目,先看看https://github.com/alexmingoia/koa-router官方文档有没有说明,不用说肯定有:
var router = require('koa-router')
router.all('/login', function *() {
this.redirect('/sign-in');
this.status = 301;
});
router.all这个方法可以,扩展一下,ES5中的express框架支持吗,google一下,http://expressjs.com/en/guide/routing.html,确实支持:
app.all('/secret', function (req, res, next) {
console.log('Accessing the secret section ...');
next(); // pass control to the next handler
});
perfect!顺便提下,rails可以用match方法匹配所有请求方式的请求。
但是这样好不好呢,并不好,一个请求支持所有请求方式会带来很严重的问题,比如跨站请求伪造等等互联网常见的问题,也增加了路由的复杂度,拖慢速度。所以一般情况下不建议这样做。