JavaScript TypeError: контракт не является функцией [duplicate]

Если вы хотите сопоставить все, что начинается с «stop», включая «stop going», «stop» и «stopping» использовать:

  ^ stop  

Если вы хотите совместить слово word , за которым следует что-либо, как в «остановке», «остановите это», но не «остановитесь», а не «остановите» использование:

  ^ stop \ W  
1247
задан GhostGambler 6 May 2014 в 14:56
поделиться

11 ответов

module.exports - это объект, который фактически возвращается в результате вызова require.

Первоначально переменная exports установлена ​​на тот же объект (т. е. это сокращенный «псевдоним»), поэтому в коде модуля вы обычно пишете что-то вроде этого:

var myFunc1 = function() { ... };
var myFunc2 = function() { ... };
exports.myFunc1 = myFunc1;
exports.myFunc2 = myFunc2;

для экспорта (или «раскрытия») функций с внутренним охватом myFunc1 и myFunc2 .

И в вызывающем коде вы должны использовать:

var m = require('./mymodule');
m.myFunc1();

, где последняя строка показывает, как результат require является (обычно) просто обычным объектом, свойства которого могут

Примечание: если вы перезапишете exports, то он больше не будет ссылаться на module.exports. Поэтому, если вы хотите назначить новый объект (или ссылку на функцию) на exports, вы также должны назначить этот новый объект module.exports


. Следует отметить, что имя добавлено в exports объект не должен совпадать с внутренним облачным именем модуля для значения, которое вы добавляете, поэтому вы можете иметь:

var myVeryLongInternalName = function() { ... };
exports.shortName = myVeryLongInternalName;
// add other objects, functions, as required

, за которым следует:

var m = require('./mymodule');
m.shortName(); // invokes module.myVeryLongInternalName
]
1455
ответ дан david.barkhuizen 16 August 2018 в 10:58
поделиться
  • 1
    Хороший ответ - мне кажется, что «разоблачения» были бы лучшим выбором терминологии, чем «экспорт», – UpTheCreek 25 March 2012 в 16:27
  • 2
    Ах, я, кажется, нашел это ... commonjs.org/specs/modules/1.0 – aikeru 28 June 2012 в 14:34
  • 3
    @ApopheniaOverload - вы можете делать & quot; export.func1, exports.func2 и т. Д. & Quot; иметь несколько открытых методов из одного файла. – hellatan 1 August 2012 в 05:50
  • 4
    Требуется модуль var m = require ('./ mymodule'); , с точкой и косой чертой. Таким образом, Node.js знает, что мы используем локальный модуль. – Gui Premonsa 22 October 2012 в 18:43
  • 5
    Обязательно используйте: require ('./ module_name') синтаксис, потому что могут быть некоторые другие модули node.js с некоторым именем и вместо того, чтобы выбирать собственный модуль, он заберет тот, который установлен с node.js – Sazid 31 October 2013 в 14:55

Несколько вещей, которые вы должны позаботиться, если назначить ссылку на новый объект на exports и / или modules.exports:

1. Все свойства / методы, ранее прикрепленные к исходным exports или module.exports, конечно, потеряны, потому что экспортируемый объект теперь ссылается на другую новую

. Это очевидно, но если вы добавите экспортированный метод в начало существующего модуля, убедитесь, что собственный экспортированный объект не ссылается на другой объект в конце

exports.method1 = function () {}; // exposed to the original exported object
exports.method2 = function () {}; // exposed to the original exported object

module.exports.method3 = function () {}; // exposed with method1 & method2

var otherAPI = {
    // some properties and/or methods
}

exports = otherAPI; // replace the original API (works also with module.exports)

2. Если один из exports или module.exports ссылается на новое значение, они больше не ссылаются на один и тот же объект

exports = function AConstructor() {}; // override the original exported object
exports.method2 = function () {}; // exposed to the new exported object

// method added to the original exports object which not exposed any more
module.exports.method3 = function () {}; 

3. Трудное следствие. Если вы измените ссылку на exports и module.exports, трудно сказать, какой API открыт (это выглядит как module.exports)

// override the original exported object
module.exports = function AConstructor() {};

// try to override the original exported object
// but module.exports will be exposed instead
exports = function AnotherConstructor() {}; 
53
ответ дан Alexandre Morgaut 16 August 2018 в 10:58
поделиться

Модуль инкапсулирует связанный код в единую единицу кода. При создании модуля это можно интерпретировать как перемещение всех связанных функций в файл.

Предположим, что есть файл Hello.js, который включает в себя две функции

sayHelloInEnglish = function() {
  return "Hello";
};
sayHelloInSpanish = function() {
  return "Hola";
};

. Мы пишем функцию только тогда, когда полезность кода имеет более одного вызова.

Предположим, что мы хотим повысить полезность функции в другом файле, скажем World.js, в этом случае экспортируется файл, который может быть получен с помощью module.exports.

Вы можете просто экспортировать оба функция по приведенному ниже коду

var anyVariable={
 sayHelloInEnglish = function() {
      return "Hello";
    };
  sayHelloInSpanish = function() {
      return "Hola";
    }; 
}
module.export=anyVariable;

Теперь вам нужно просто потребовать, чтобы имя файла в World.js inorder использовало эти функции

var world= require("./hello.js");
1
ответ дан alphadogg 16 August 2018 в 10:58
поделиться
  • 1
    Спасибо Если это помогло вам, пожалуйста, примите мой ответ :) – Shantanu Madane 18 June 2016 в 05:54
  • 2
    Немного поздно к партию :) – Ben Taliadoros 6 October 2016 в 17:44
  • 3
    @BenTaliadoros я тоже думаю, что он опаздывает, и я также думаю, что у его anyVariable объекта много ошибок. строка выше sayHelloInSpanish метод не должен заканчиваться точкой с запятой (;) и sayHelloInSpanish = функция неверна. Все вещи не соответствуют этому объекту. я отредактирую его ответ – divine 14 April 2017 в 08:18
  • 4
    редактирование отключено. Что еще редактировало alphadogg в этом ответе? – divine 14 April 2017 в 08:24
  • 5
    Просто форматирование. Если это не какая-то сумасшедшая вещь, с которой я не сталкивался, и я уверен, что ее нет, тогда это недействительно JS вообще – Ben Taliadoros 25 April 2017 в 13:56

При делении кода программы на несколько файлов module.exports используется для публикации переменных и функций для потребителя модуля. Вызов require() в исходном файле заменяется соответствующим module.exports, загруженным из модуля.

Помните, что при записи модулей

  • Загрузка модулей кэшируется, только начальный вызов оценивает JavaScript.
  • В модуле можно использовать локальные переменные и функции, а не все, что нужно экспортировать.
  • Объект module.exports также доступен как сокращенное exports. Но при возврате единственной функции всегда используйте module.exports.

module exports diagram [/g1]

Согласно: «Модули Часть 2 - Написание модулей» .

194
ответ дан Community 16 August 2018 в 10:58
поделиться
  • 1
    как я могу вызвать, требуется какой-то модуль из другой папки, у которой нет какой-либо корневой папки как моей? – Igal 20 February 2013 в 10:32
  • 2
    @ user301639 вы можете использовать относительные пути для перемещения иерархии файловой системы. require начинается с папки, в которой вы выполняете node app.js. Я рекомендую вам опубликовать новый вопрос с явными примерами структуры кода + папки, чтобы получить более четкий ответ. – Jed Watson 20 February 2013 в 14:35
  • 3
    Мне нужно было настроить пример module.exports, чтобы он работал. файл: var sayHello = require('./ex6_module.js'); console.log(sayHello()); и модуль: module.exports = exports = function() { return "Hello World!"; } – Jason Lydon 23 July 2014 в 15:21
  • 4
    Нашел пример приращения действительно хороший, и я использовал это, чтобы обновить свой ум каждый раз, когда я перегружаюсь тем, что я делаю с экспортом. – munkee 9 December 2014 в 12:35

Есть некоторые по умолчанию или существующие модули в node.js при загрузке и установке node.js, таких как http, sys и т. д.

Поскольку они уже находятся в node.js , когда мы хотим использовать эти модули, мы в основном используем модули импорта , но почему? потому что они уже присутствуют в node.js. Импорт - это как перенос их из node.js и включение их в вашу программу. И затем, используя их.

В то время как Экспорт в точности противоположный, вы создаете модуль, который вы хотите, скажем, module addition.js и помещаем этот модуль в node.js , вы делаете это, экспортируя его.

Прежде чем написать что-нибудь здесь, помните, module.exports.additionTwo такой же, как export.additionTwo

поэтому это нам нравится

exports.additionTwo = function(x)
{return x+2;};

Будьте осторожны с дорожкой

Допустим, вы создали модуль add.js,

exports.additionTwo = function(x){
return x + 2;
};

Когда вы запустите это в своей командной строке NODE.JS:

node
var run = require('addition.js');

Это приведет к ошибке, сказав, что

Ошибка: не удается найти модуль addition.js

Это связано с тем, что процесс node.js не может скомпоновать add.js, так как мы не упоминали путь. Таким образом, мы можем установить путь, используя NODE_PATH

set NODE_PATH = path/to/your/additon.js

. Теперь это должно успешно работать без каких-либо ошибок!

Еще одна вещь: вы также можете запустить добавление. js, не устанавливая NODE_PATH, вернитесь к командной строке nodejs:

node
var run = require('./addition.js');

Поскольку мы предоставляем путь здесь, говоря, что он находится в текущем каталоге ./, это также должно успешно выполняться.

4
ответ дан JumpMan 16 August 2018 в 10:58
поделиться

свойство module.exports или объект экспорта позволяет модулю выбирать, что должно быть совместно использовано с приложением

enter image description here [/g1]

У меня есть видео на Доступен модуль_экспорт здесь

23
ответ дан K Scandrett 16 August 2018 в 10:58
поделиться

Цель:

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

Wikipedia

Я полагаю, что становится сложно писать большие программы без модульного / многоразового кода. В nodejs мы можем создавать модульные программы, используя module.exports, определяя, что мы открываем и составляем нашу программу с помощью require.

Попробуйте этот пример:

fileLog .js

function log(string) {
  require('fs').appendFileSync('log.txt',string);
}

module.exports = log;

stdoutLog.js

function log(string) {
  console.log(string);
}

module.exports = log;

program.js

const log = require('./stdoutLog.js')

log('hello world!');

выполнить

$ node program.js

hello world!

Теперь попробуйте выполнить обмен файлами ./stdoutLog.js для ./fileLog.js.

0
ответ дан Moriarty 16 August 2018 в 10:58
поделиться

ссылка ссылается следующим образом:

exports = module.exports = function(){
    //....
}

свойства exports или module.exports, такие как функции или переменные, будут экспонированы вне

, существует что вы должны уделять больше внимания: не экспортируйте override.

почему?

, поскольку экспортирует только ссылку на module.exports, вы можете добавить свойства в экспорт, но если вы переопределите экспорт, ссылка будет нарушена.

хороший пример:

exports.name = 'william';

exports.getName = function(){
   console.log(this.name);
}

плохой пример:

exports = 'william';

exports = function(){
     //...
}

Если вы просто хотите разоблачить только одну функцию или переменную, например:

// test.js
var name = 'william';

module.exports = function(){
    console.log(name);
}   

// index.js
var test = require('./test');
test();

этот модуль обнаружил только одну функцию, а свойство имени является закрытым для внешнего.

8
ответ дан qianjiahao 16 August 2018 в 10:58
поделиться
56
ответ дан Alexandre Morgaut 6 September 2018 в 05:21
поделиться
195
ответ дан Community 6 September 2018 в 05:21
поделиться
0
ответ дан Willem van der Veen 6 September 2018 в 05:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: