【问题标题】:Call exported function koajs调用导出函数 koajs
【发布时间】:2014-06-20 15:23:56
【问题描述】:

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

文件a.js路线-http://127.0.0.1:3000/foo

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

文件b.jsroute - 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) 并让它像普通路由器调用它一样运行。

【问题讨论】:

  • 我认为你的共享功能最好放在一个中间件中,/foo/bar 路由都可以调用yield this.sharedFeature(opts)。如果你想走自己的路,那么就做yield a.foo.bind(this)
  • 嗯,@kilianc 好像在做yield a.foo.bind(this) 并没有真正调用函数也没有从函数返回? a.foo 有什么特别需要做的吗?
  • a.foo 是一个生成器,对吧?那么你不必特别做任何事情,试试a.foo.call(this).bind 也应该可以工作
  • @kilianc 你是对的,这确实有效。如果你把它作为答案,我会接受。感谢您的帮助。

标签: node.js koa


【解决方案1】:

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

如果你想走自己的路,那么就做yield a.foo.call(this)

【讨论】:

  • yield a.foo.call(this) 更好。无需绑定
【解决方案2】:

那里几乎没有问题。一种是您必须返回值(或在回调中将值传回)。还有一个问题是如何需要 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"

【讨论】:

  • 不是我真正想要的,特别是我需要将 bar 中的上下文传递给 foo。关于a 是如何被要求的,这只是一个例子。
  • 好的,我会修改答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-02
  • 2014-04-30
  • 1970-01-01
  • 2011-02-24
  • 1970-01-01
  • 2011-01-16
相关资源
最近更新 更多