1.将learn_koa_url文件夹复制一份命名为(learn_koa_url1)
2.在(learn_koa_url1)下新建两个文件夹
(1).vscode --> launch.json
(2)controllers -- > index.js和login.js
最后目录结构如下
3.整理后的代码如下
(1)hello.js的代码
var fn_hello = async(ctx, next) => {
var name = ctx.params.name;
ctx.response.body = `<h1>Hello,${name}!</h1>`
};
module.exports = {
'GET/hello/:name': fn_hello,
}
(2)index.js的代码如下
var fn_index = async (ctx, next) => {
ctx.response.body = `<h1>Index</h1>
<form action="/signin" method="post">
<p>Name:<input name="name" value="koa"></p>
<p>Password: <input name="password" type="password"></p>
<p><input type="submit" value="Submit"></p>
</form>`;
}
var fn_signin = async(ctx, next) => {
var name = ctx.request.body.name || '',
password = ctx.request.body.password || '';
console.log(`signin with name:${name},password:${password}`);
if (name==='koa' && password === '12345') {
ctx.response.body = `<h1>Welcome,${name} !</h1>`;
} else {
ctx.response.body = `<h1>Login failed!</h1>
<p><a href='/'>Try again</a></p>`
}
};
module.exports = {
'GET /' : fn_index,
'POST /signin' : fn_signin
}
(3)app.js的代码如下
const Koa = require('koa');
const bodyParser = require("koa-bodyparser");
const controller = require('./controller');
const app = new Koa();
// log request URL:
app.use(async (ctx, next) => {
console.log(`Process ${ctx.request.method} ${ctx.request.url}...`);
await next();
});
app.use(bodyParser());
app.use(controller());
app.listen(3000);
console.log('app started at port 3000...');
(4)controllers.js的代码如下
const fs = require('fs');
function addMapping(router,mapping) {
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 if (url.startsWith('PUT ')) {
var path = url.substring(4);
router.put(path, mapping[url]);
console.log(`register URL mapping: PUT ${path}`);
} else if (url.startsWith('DELETE ')) {
var path = url.substring(7);
router.del(path, mapping[url]);
console.log(`register URL mapping: DELETE ${path}`);
} else {
// 无效的URL
console.log(`invalid URL: ${url}`);
}
}
}
function addControllers(router,dir) {
// 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);
// addMapping(router,mapping);
// }
fs.readdirSync(__dirname + '/' + dir).filter((f)=>{
return f.endsWith('.js');
}).forEach((f)=>{
console.log('process controller:${f}...');
// 导入js文件
let mapping = require(__dirname + '/' + dir + '/' + f);
addMapping(router,mapping);
});
}
module.exports = function (dir) {
let controllers_dir = dir || 'controllers', //如果不传目录,默认扫描controllers
router = require('koa-router')();
addControllers(router, controllers_dir);
return router.routes();
}