koa指的是一个类似于Express的基于Node实现的web框架,致力于成为web应用和API开发领域中的一个更小、更富有表现力、更健壮的基石。Koa并没有捆绑任何中间件,而是提供了一套优雅的方法,帮助用户快速而愉快地编写服 ...
本教程操作环境:windows7系统、nodejs 12.19.0&&koa2.0版、Dell G3电脑。
Koa 是一个新的 web 框架,由 Express 幕后的原班人马打造, 致力于成为 web 应用和 API 开发领域中的一个更小、更富有表现力、更健壮的基石。 通过利用 async 函数,Koa 帮你丢弃回调函数,并有力地增强错误处理。 Koa 并没有捆绑任何中间件, 而是提供了一套优雅的方法,帮助您快速而愉快地编写服务端应用程序。 官方 1 Koa应用一个 var koa = require('koa');
var app = koa();
app.use(function *(){
this.body = 'Hello World';
});
app.listen(3000);
var http = require('http');
var koa = require('koa');
var app = koa();
http.createServer(app.callback()).listen(3000);2 中间件
app.use(function* (next){
var start = new Date; // (1)
yield next; // (2)
var ms = new Date - start; // (3)
console.log('%s %s - %s', this.method, this.url, ms); // (4)
});上面代码中,
app.use(function *() {
this.body = "header\n";
yield saveResults.call(this);
this.body += "footer\n";
});
function *saveResults() {
this.body += "Results Saved!\n";
}上面代码中,第一个中间件调用第二个中间件saveResults,它们都向this.body写入内容。最后,this.body的输出如下。 header Results Saved! footer 只要有一个中间件缺少 app.use(function *(next){
console.log('>> one');
yield next;
console.log('<< one');
});
app.use(function *(next){
console.log('>> two');
this.body = 'two';
console.log('<< two');
});
app.use(function *(next){
console.log('>> three');
yield next;
console.log('<< three');
});上面代码中,因为第二个中间件少了 app.use(function* (next) {
if (skip) return yield next;
})由于 function logger(format) {
return function *(next){
var str = format
.replace(':method', this.method)
.replace(':url', this.url);
console.log(str);
yield next;
}
}
app.use(logger(':method :url'));上面代码中,真正的中间件是logger函数的返回值,而logger函数是可以接受参数的。 3 多个中间件的合并由于中间件的参数统一为 function *random(next) {
if ('/random' == this.path) {
this.body = Math.floor(Math.random()*10);
} else {
yield next;
}
};
function *backwards(next) {
if ('/backwards' == this.path) {
this.body = 'sdrawkcab';
} else {
yield next;
}
}
function *pi(next) {
if ('/pi' == this.path) {
this.body = String(Math.PI);
} else {
yield next;
}
}
function *all(next) {
yield random.call(this, backwards.call(this, pi.call(this, next)));
}
app.use(all);上面代码中,中间件all内部,就是依次调用random、backwards、pi,后一个中间件就是前一个中间件的参数。 function compose(middleware){
return function *(next){
if (!next) next = noop();
var i = middleware.length;
while (i--) {
next = middleware[i].call(this, next);
}
yield *next;
}
}
function *noop(){}上面代码中,middleware是中间件数组。前一个中间件的参数是后一个中间件,依次类推。如果最后一个中间件没有next参数,则传入一个空函数。 4 路由可以通过this.path属性,判断用户请求的路径,从而起到路由作用。 app.use(function* (next) {
if (this.path === '/') {
this.body = 'we are at home!';
}
})
// 等同于
app.use(function* (next) {
if (this.path !== '/') return yield next;
this.body = 'we are at home!';
})下面是多路径的例子。 let koa = require('koa')
let app = koa()
// normal route
app.use(function* (next) {
if (this.path !== '/') {
return yield next
}
this.body = 'hello world'
});
// /404 route
app.use(function* (next) {
if (this.path !== '/404') {
return yield next;
}
this.body = 'page not found'
});
// /500 route
app.use(function* (next) {
if (this.path !== '/500') {
return yield next;
}
this.body = 'internal server error'
});
app.listen(8080)上面代码中,每一个中间件负责一个路径,如果路径不符合,就传递给下一个中间件。 var app = require('koa')();
var Router = require('koa-router');
var myRouter = new Router();
myRouter.get('/', function *(next) {
this.response.body = 'Hello World!';
});
app.use(myRouter.routes());
app.listen(3000);上面代码对根路径设置路由。
router.get('/', function *(next) {
this.body = 'Hello World!';
});上面代码中, router.get('user', '/users/:id', function *(next) {
// ...
});上面代码中,路径模式 router.url('user', 3);
// => "/users/3"
router.url('user', { id: 3 });
// => "/users/3"上面代码中,user就是路径模式的名称,对应具体路径/users/:id。url方法的第二个参数3,表示给定id的值是3,因此最后生成的路径是/users/3。 var router = new Router({
prefix: '/users'
});
router.get('/', ...); // 等同于"/users"
router.get('/:id', ...); // 等同于"/users/:id"路径的参数通过 // 访问 /programming/how-to-node
router.get('/:category/:title', function *(next) {
console.log(this.params);
// => { category: 'programming', title: 'how-to-node' }
});
param方法可以针对命名参数,设置验证条件。
router
.get('/users/:user', function *(next) {
this.body = this.user;
})
.param('user', function *(id, next) {
var users = [ '0号用户', '1号用户', '2号用户'];
this.user = users[id];
if (!this.user) return this.status = 404;
yield next;
})上面代码中,如果 router.redirect('/login', 'sign-in');
// 等同于
router.all('/login', function *() {
this.redirect('/sign-in');
this.status = 301;
});redirect方法的第一个参数是请求来源,第二个参数是目的地,两者都可以用路径模式的别名代替。 5 context对象
app.use(function *(){
this; // is the Context
this.request; // is a koa Request
this.response; // is a koa Response
});
this.state.user = yield User.find(id); 上面代码中,
this.throw(403);
this.throw('name required', 400);
this.throw('something exploded');
this.throw(400, 'name required');
// 等同于
var err = new Error('name required');
err.status = 400;
throw err;6 错误处理机制Koa提供内置的错误处理机制,任何中间件抛出的错误都会被捕捉到,引发向客户端返回一个 app.use(function *() {
throw new Error();
});上面代码中,中间件内部抛出一个错误,并不会导致Koa应用挂掉。Koa内置的错误处理机制,会捕捉到这个错误。 app.use(function *() {
try {
yield saveResults();
} catch (err) {
this.throw(400, '数据无效');
}
});上面代码自行部署了 app.on('error', function(err){
log.error('server error', err);
});
app.on('error', function(err, ctx){
log.error('server error', err, ctx);
});如果一个错误没有被捕获,koa会向客户端返回一个500错误“Internal Server Error”。 this.throw(403);
this.throw('name required', 400);
this.throw(400, 'name required');
this.throw('something exploded');
this.throw('name required', 400)
// 等同于
var err = new Error('name required');
err.status = 400;
throw err;
this.throw方法的两个参数,一个是错误码,另一个是报错信息。如果省略状态码,默认是500错误。
this.assert方法用于在中间件之中断言,用法类似于Node的assert模块。
this.assert(this.user, 401, 'User not found. Please login!');上面代码中,如果this.user属性不存在,会抛出一个401错误。 app.use(function *(next) {
try {
yield next;
} catch (err) {
this.status = err.status || 500;
this.body = err.message;
this.app.emit('error', err, this);
}
});
app.use(function *(next) {
throw new Error('some error');
})7 cookiecookie的读取和设置。 this.cookies.get('view');
this.cookies.set('view', n);
app.keys = ['secret1', 'secret2'];
this.cookies.set('name', '张三', { signed: true });this.cookie的配置对象的属性如下。
8 sessionvar session = require('koa-session');
var koa = require('koa');
var app = koa();
app.keys = ['some secret hurr'];
app.use(session(app));
app.use(function *(){
var n = this.session.views || 0;
this.session.views = ++n;
this.body = n + ' views';
})
app.listen(3000);
console.log('listening on port 3000');【推荐学习:《nodejs 教程》】 以上就是nodejs中的koa是什么的详细内容,更多请关注模板之家(www.mb5.com.cn)其它相关文章! |
