调用导出函数koajs

时间:2014-06-20 15:23:56

标签: node.js koa

我有一个koa应用,它有一堆功能分成不同的文件。当一个路由被调用时,我需要将上下文this传递给另一个文件中的另一个函数(也是一个路由)。

档案a.js路线 - http://127.0.0.1:3000/foo

exports.foo = function *() {
  this.body = 'Some Value';
}

档案b.js路线 - http://127.0.0.1:3000/bar

var a = require('a');

exports.bar = function *() {
  this.body = yield a.foo(); // this obviously doesn't work.
}

我希望能够yield a.foo()使用当前上下文(this)并让它像正常路由器调用一样运行。

2 个答案:

答案 0 :(得分:2)

我认为您的共享功能最好放在中间件中,/foo/bar路由都可以调用yield this.sharedFeature(opts)

如果你想按照自己的方式行事,那就去做yield a.foo.call(this)

答案 1 :(得分:0)

那里几乎没有问题。一个是你必须返回值(或在回调中传递值)。还有一个问题是如何需要a.js。你需要添加它的路径“./a”(或存储它的地方),而不是“a”。这是修订版(请注意,我不在代码中包含koajs,因为这只是javascript / nodejs问题):

// a.js
exports.foo = function() {
  this.body = 'Some Value';
  return this;
}

// b.js
var a = require('./a');  // assumes a.js is in same directory as b.js

exports.bar = function () {
  var aThis =a.foo(); 
  console.log(aThis.body);
};

// c.js
var b = require('./b');

b.bar();   // <<<<< prints "Some Value"

这就是bar()的上下文可以传递给foo()的方法:

// a.js
exports.foo = function(bScope) {
  console.log("this is bValue of b scope: %s", bScope.bValue);
}

// b.js
var a = require('./a');

exports.bar = function () {
  this.bValue = "value of b";
  a.foo(this);
}

// c.js
var b = require('./b');

b.bar();   // <<<<<<<< prints "this is bValue of b scope: value of b"