NodeJS: вызвать удовольствие c из другого удовольствия c в том же файле - PullRequest
0 голосов
/ 07 января 2020

У меня есть NodeJS программа.

В одном классе у меня есть различные служебные методы. Одна функция, safeGithubPu sh, вызывает safeString, другая забава c в том же классе

module.exports = {

  safeString(stringToCheck) {
    console.log(validator.isAscii(stringToCheck), validator.matches(stringToCheck, /^((\w)*[-.]?(\w)*)*$/))
    return (
      validator.isAscii(stringToCheck) &&
      validator.matches(stringToCheck, /^((\w)*[-.]?(\w)*)*$/)
    );
  },

  safeGithubPush(currentJob) {
    if (
      !currentJob ||
      !currentJob.payload ||
      !currentJob.payload.repoName ||
      !currentJob.payload.repoOwner ||
      !currentJob.payload.branchName
    ) {
      this.logIn(
        currentJob,
        `${'    (sanitize)'.padEnd(15)}failed due to insufficient job definition`
      );
      throw invalidJobDef;
    }

    if (
      this.safeString(currentJob.payload.repoName) &&
      this.safeString(currentJob.payload.repoOwner) &&
      this.safeString(currentJob.payload.branchName)
    ) {
      return true;
    }
    throw invalidJobDef;
  },

} 

В то время как this.logIn (), еще одна забава c в служебном классе, работает просто отлично, Я получаю сообщение об ошибке для safeString:

Error caught by first catch: TypeError: this.safeString is not a function

Я следовал за предложением решения другим постом SO :

safeString: function(stringToCheck){
...
}

safeGithubPush(currentJob) {
...
if (
    this.safeString(currentJob.payload.repoName) &&
    this.safeString(currentJob.payload.repoOwner) &&
    this.safeString(currentJob.payload.branchName)
    ) {
       return true;
   }
}

Но это также получает, TypeError: this.safeString is not a function ,

Я не использую функции стрелок, что является объяснением этой ошибки в другом сообщении SO

1 Ответ

1 голос
/ 07 января 2020

Я не думаю, что причина определяется с помощью кода, который вы в настоящее время представляете. Скорее всего, это связано с тем, как вы звоните safeGithubPush. Если вы сделаете что-то, что изменит привязку this, this.safeString потерпит неудачу.

const foo = {
  fizz() {
    console.log("fizz");
  },
  buzz() {
    this.fizz();
  }
};

// "this" is correct
foo.buzz();

// "this" has no fizz to call
const myFizz = foo.buzz;
myFizz();

Учитывая, что вы присоединяете их к module.exports Я собираюсь догадаться, что вы отключаете эти функции при вызове require, а затем пытаетесь использовать их голыми, что делает проблема очевидна после просмотра моего примера выше:

// Ignore these 2 lines, they let this look like node
const module = {};
const require = () => module.exports;
// Ignore above 2 lines, they let this look like node

// Your module "some.js"
module.exports = {
  safeString(str) {
    return true;
  },
  safeGithubPush(currentJob) {
    if (!this.safeString("some")) {
      throw new Error("Not safe");
    }
    return true;
  }
};

try {
  // Some consumer module that doesn't work
  const {safeGithubPush} = require("./some.js");

  const isItSafe = safeGithubPush();

  console.log(`Safe? ${isItSafe}`);
} catch (err) {
  console.error("Didn't bind right \"this\"");
}

try {
  // Some consumer module that DOES work
  const someModule = require("./some.js");

  const isItSafe = someModule.safeGithubPush();

  console.log(`Safe? ${isItSafe}`);
} catch (err) {
  console.error(err);
}

Я бы перестроил этот код. Вы говорите, что это служебные функции, которые заставляют меня думать, что вам не нужно структурировать их с учетом this.

Вместо того, чтобы присоединять их все к module.exports при их определении, определите их снаружи и напрямую ссылаться на функции, которые вы хотите использовать, , затем присоедините их к exports, чтобы другие модули могли использовать функции:

function safeString(stringToCheck) {
  return true;
}

function safeGithubPush(currentJob) {
  if (!safeString("some")) {
    throw new Error("Not safe");
  }
  return true;
}

module.exports = {
  safeString,
  safeGithubPush
};
...