Koa处理url
2021-05-03 11:28
标签:管理 sig failed 模块化 json ref 启动 substr app 一、koa-router 为了处理URL,我们需要引入 我们修改 注意导入 二、处理post请求 用 用post请求处理URL时,我们会遇到一个问题:post请求通常会发送一个表单,或者JSON,它作为request的body发送,但无论是Node.js提供的原始request对象,还是koa提供的request对象,都不提供解析request的body的功能! 所以,我们又需要引入另一个middleware来解析原始request请求,然后,把解析后的参数,绑定到 接下来,修改 在合适的位置加上 由于middleware的顺序很重要,这个 三、重构 所有的URL处理函数都放到 如果能把URL处理函数集中到某个js文件,或者某几个js文件中就好了,然后让 我们先在 Name: "name" value="koa"> Password: "password" type="password"> "submit" value="Submit"> 这个 现在,我们修改 四、Controller Middleware 最后,我们把扫描 这样一来,我们在 经过重新整理后的工程 Koa处理url 标签:管理 sig failed 模块化 json ref 启动 substr app 原文地址:https://www.cnblogs.com/goloving/p/12121944.htmlkoa-router
这个middleware,让它负责处理URL映射。app.js
,使用koa-router
来处理URL:const Koa = require(‘koa‘);
// 注意require(‘koa-router‘)返回的是函数:
const router = require(‘koa-router‘)();
const app = new Koa();
// log request URL:
app.use(async (ctx, next) => {
console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
await next();
});
// add url-route:
router.get(‘/hello/:name‘, async (ctx, next) => {
var name = ctx.params.name;
ctx.response.body = `
Hello, ${name}!
`;
});
router.get(‘/‘, async (ctx, next) => {
ctx.response.body = ‘Index
‘;
});
// add router middleware:
app.use(router.routes());
app.listen(3000);
console.log(‘app started at port 3000...‘);koa-router
的语句最后的()
是函数调用const router = require(‘koa-router‘)();
// 相当于:
const fn_router = require(‘koa-router‘);
const router = fn_router();
router.get(‘/path‘, async fn)
处理的是get请求。如果要处理post请求,可以用router.post(‘/path‘, async fn)
。ctx.request.body
中。 koa-bodyparser
就是用来干这个活的。使用npm install
安装。app.js
,引入koa-bodyparser
:const bodyParser = require(‘koa-bodyparser‘);
app.use(bodyParser());
koa-bodyparser
必须在router
之前被注册到app
对象上。app.js
里显得很乱,而且,每加一个URL,就需要修改app.js
。随着URL越来越多,app.js
就会越来越长。app.js
自动导入所有处理URL的函数。这样,代码一分离,逻辑就显得清楚了。最好是这样:url2-koa/
+- controllers/
| |
| +- login.js 处理login相关URL
| |
| +- users.js 处理用户管理相关URL
|
+- app.js 使用koa的js
|
+- package.json 项目描述文件
|
+- node_modules/
controllers
目录下编写index.js
var fn_index = async (ctx, next) => {
ctx.response.body = `
Index
/signin" method="post">
Welcome, ${name}!
`;
} else {
ctx.response.body = `Login failed!
`;
}
};
module.exports = {
‘GET /‘: fn_index,
‘POST /signin‘: fn_signin
};index.js
通过module.exports
把两个URL处理函数暴露出来。类似的,hello.js
把一个URL处理函数暴露出来:var fn_hello = async (ctx, next) => {
var name = ctx.params.name;
ctx.response.body = `
Hello, ${name}!
`;
}
module.exports = {
‘GET /hello/:name‘: fn_hello
}app.js
,让它自动扫描controllers
目录,找到所有js
文件,导入,然后注册每个URL:// 先导入fs模块,然后用readdirSync列出文件
// 这里可以用sync是因为启动时只运行一次,不存在性能问题:
var files = fs.readdirSync(__dirname + ‘/controllers‘);
// 过滤出.js文件:
var js_files = files.filter((f)=>{
return f.endsWith(‘.js‘);
});
// 处理每个js文件:
for (var f of js_files) {
console.log(`process controller: ${f}...`);
// 导入js文件:
let mapping = require(__dirname + ‘/controllers/‘ + f);
for (var url in mapping) {
if (url.startsWith(‘GET ‘)) {
// 如果url类似"GET xxx":
var path = url.substring(4);
router.get(path, mapping[url]);
console.log(`register URL mapping: GET ${path}`);
} else if (url.startsWith(‘POST ‘)) {
// 如果url类似"POST xxx":
var path = url.substring(5);
router.post(path, mapping[url]);
console.log(`register URL mapping: POST ${path}`);
} else {
// 无效的URL:
console.log(`invalid URL: ${url}`);
}
}
}
controllers
目录和创建router
的代码从app.js
中提取出来,作为一个简单的middleware使用,命名为controller.js
:const fs = require("fs")
function addMapping(router, mapping) {
for (var url in mapping) {
if (url.startsWith(‘GET ‘)) {
var path = url.substring(4);
router.get(path, mapping[url]);
console.log(`register URL mapping: GET ${path}`);
} else if (url.startsWith(‘POST ‘)) {
var path = url.substring(5);
router.post(path, mapping[url]);
console.log(`register URL mapping: POST ${path}`);
} else {
console.log(`invalid URL: ${url}`);
}
}
}
function addControllers(router, dir) {
// 先导入fs模块,然后用readdirSync列出文件
// 这里可以用sync是因为启动时只运行一次,不存在性能问题:
var files = fs.readdirSync(__dirname + dir);
// 过滤出.js文件:
var js_files = files.filter(f => {
return f.endsWith(‘.js‘);
});
// 处理每个js文件:
for (var f of js_files) {
console.log(`process controller: ${f}...`);
// 导入js文件:
let mapping = require(__dirname + ‘/controllers/‘ + f);
addMapping(router, mapping);
}
}
module.exports = function (dir) {
let controllers_dir = dir || ‘/controllers‘,
router = require("koa-router")()
addControllers(router, controllers_dir)
return router.routes()
}
app.js
的代码又简化了:const Koa = require("koa")
const bodyParser = require("koa-bodyparser")
const controller = require("./controller")
const app = new Koa()
app.use(bodyParser())
// add router middleware:
app.use(controller());
app.listen(8080)
console.log("app started at port 8080")
url2-koa
目前具备非常好的模块化,所有处理URL的函数按功能组存放在controllers
目录,今后我们也只需要不断往这个目录下加东西就可以了,app.js
保持不变。