最近有时间一直在看koa nc-example 的项目源码 有3个问题: 1.yield yield* lz知道他们俩的区别 但在koa里是否没有区别,因为都是调用下一个中间件? 2.后面的next是否都只下一个中间件? 3.一个中间件中是否只能有一个yield next或者yield* next?
@ncuzp 的项目user_sess.js的代码
'use strict';
let path = require('path');
let User = require('../models').User;
// 需要过滤的文件后缀
let filterSuffix = [
'.ico', '.js', '.css',
'.jpg', '.jpeg', '.png',
'.gif'
];
module.exports = function* (next){
// 不处理filterSuffix中包含的文件
if(filterSuffix.indexOf(path.extname(this.request.url)) !== -1){
yield next;
}else{
let loginname = this.session.loginname;
let url = this.request.url;
let userPromise = Promise.resolve();
// 静态文件过滤
if(loginname){
yield Promise.resolve()
.then(() => User.findOne({loginname: loginname}))
.then((user) => {this.session.user = user || undefined;});
}
yield* next;
// just let session record loginname before leave
this.session.user = undefined;
}
};
下面是koa guide里的一张图片,并没有用到 yield* https://github.com/koajs/koa/blob/master/docs/middleware.gif
yield next; // next 可以是任意值 yield* next; // next 必须是 generator yield* 不是标准, 不要使用, 据说新版已经删除了…
@magicdawn “yield* next; // next 必须是 generator” 不是必须 generator, 而是可迭代,要遵循迭代协议的对象。
https://github.com/fundon/ES6-QuickStart-and-Tips#generators
@magicdawn 也就是说yield* next 与 yield next在koa里是一样的作用对么?
别用 yield* 就好
@magicdawn +1
@magicdawn 中间件编写也这样么
了解, thanks