Nodejs koa写中间件的一个小问题,求助
Nodejs koa写中间件的一个小问题,求助
在koa里面写中间件,格式是这样:
module.exports = function(opts){
return function *(next){
yield next;
}
}
每次接收到请求都会走一遍return的生成器函数
但是我现在想在生成器函数外面,也就是在启动程序的时候执行其他生成器函数,请问怎么做?
就是下面这样,在程序加载的时候执行yield test();
而不是在return function *(){}
里面每次用户请求时执行
module.exports = function(opts){
return function *(next){
yield next;
}
function *test(){
....
}
}
7 回复
在 Koa 中编写中间件时,通常我们会在每次请求处理时使用生成器函数。但如果你希望在应用程序启动时执行某些生成器函数,你可以在模块导出之前执行这些生成器函数。这样可以确保这些操作只在应用程序启动时执行一次。
以下是一个示例代码,展示了如何实现这一点:
// middleware.js
function *test() {
console.log('Executing test generator function on app startup');
// 这里可以进行一些初始化操作,例如数据库连接、读取配置等
}
// 在导出中间件之前先执行 test 函数
test();
module.exports = function(opts) {
return function *(next) {
console.log('Handling request in middleware');
yield next;
};
};
在这个示例中,test
生成器函数在模块导出之前被调用并执行。这确保了它只在应用程序启动时运行一次,而不是在每次请求时都运行。
如果你需要在 test
函数中执行异步操作(例如数据库连接),你可以使用 co
库来处理异步生成器函数。以下是修改后的示例:
// middleware.js
const co = require('co');
function *test() {
console.log('Executing test generator function on app startup');
// 这里可以进行一些初始化操作,例如数据库连接、读取配置等
yield new Promise((resolve, reject) => {
setTimeout(() => {
console.log('Async operation completed');
resolve();
}, 1000);
});
}
// 在导出中间件之前先执行 test 函数
co(test());
module.exports = function(opts) {
return function *(next) {
console.log('Handling request in middleware');
yield next;
};
};
在这个示例中,我们使用 co
库来处理异步生成器函数 test
。co
会自动处理生成器函数中的异步操作,并确保它们按顺序执行。
通过这种方式,你可以在应用程序启动时执行一些初始化操作,而不必在每次请求时都执行这些操作。
或许这里需要引入co
co(function () {
yield test();
// app
// app.use(foo);
})();
var co = require('co');
module.exports = function(opts){
co(function () {
yield test();
})();
return function *(next){
yield next;
}
function *test(){
....
}
}
是这样吗?报错啊
/usr/local/bin/node -harmony app.js
/Users/gongwenshuo/Project/koa/node_modules/koa-test/index.js:111
yield aaa();
^^^
SyntaxError: Unexpected identifier
at exports.runInThisContext (vm.js:69:16)
at Module._compile (module.js:432:25)
at Object.Module._extensions..js (module.js:467:10)
at Module.load (module.js:349:32)
at Function.Module._load (module.js:305:12)
at Module.require (module.js:357:17)
at require (module.js:373:17)
at Object.<anonymous> (/Users/gongwenshuo/Project/koa/app.js:3:15)
at Module._compile (module.js:449:26)
at Object.Module._extensions..js (module.js:467:10)
Process finished with exit code 1
搞定了谢谢!!!
var co = require('co');
module.exports = function(opts){
co(function *() {
yield test();
})();
return function *(next){
yield next;
}
function *test(){
....
}
}
function * test(){
}
module.exports = function * (next) {
yield test();
};
看来koa关注的人不少 我这几天也忙着写中间件~ 不知道大家koa是玩还是商业项目 我是正正经经搞商业项目