Вызов экспортированной функции koajs

#node.js #koa

#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() использовать текущий context ( this ) и заставить его работать так, как будто он вызывается обычным маршрутизатором.

Комментарии:

1. Я думаю, что ваша общая функциональность лучше разместить в промежуточном программном обеспечении, где оба /foo и /bar маршруты могут вызывать yield this.sharedFeature(opts) . Если вы хотите пойти своим путем, тогда просто сделайте yield a.foo.bind(this)

2. Хммм, @kilianc похоже yield a.foo.bind(this) , что выполнение на самом деле не вызывает функцию и не возвращается из функции? Есть ли что-то особенное, что вам нужно сделать a.foo ?

3. a.foo — это генератор, верно? тогда вам не нужно делать ничего конкретного, попробуйте a.foo.call(this) , но .bind тоже должно сработать

4. @kilianc вы были правы, это действительно работает. Если вы укажете это в качестве ответа, я соглашусь. Спасибо за вашу помощь.

Ответ №1:

Я думаю, что ваша общая функциональность лучше разместить в промежуточном программном обеспечении, где оба /foo и /bar маршруты могут вызывать yield this.sharedFeature(opts) .

Если вы хотите пойти своим путем, тогда просто сделайте yield a.foo.call(this)

Комментарии:

1. yield a.foo.call(this) лучше. нет необходимости привязывать

Ответ №2:

Здесь есть несколько проблем. во-первых, вы должны вернуть значение (или передать значение обратно при обратном вызове). Также существует проблема с тем, как требуется файл .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"
 

Комментарии:

1. Не совсем то, что я ищу, в частности, мне нужен контекст из bar для передачи в foo. Что касается того, как a это требуется, это всего лишь пример.

2. Хорошо, я пересмотрю ответ на этот вопрос