Node.js 为什么这个NPM包说它不是构造函数?

Node.js 为什么这个NPM包说它不是构造函数?,node.js,npm,Node.js,Npm,我正在从事一个需要我使用的Sails.js项目。我创建了一个新的Sails.js服务,以便在npm安装后调用此包-如下所示: // Require and initialize the rules engine var jsonRulesEngine = require('json-rules-engine'), rulesEngine = new jsonRulesEngine(); { Engine: function(...) { ... }, Fact: functio

我正在从事一个需要我使用的Sails.js项目。我创建了一个新的Sails.js服务,以便在
npm安装后调用此包
-如下所示:

// Require and initialize the rules engine
var jsonRulesEngine = require('json-rules-engine'),
    rulesEngine = new jsonRulesEngine();
{
  Engine: function(...) { ... },
  Fact: function(...) { ... },
  Operator: function(...) { ... },
  Rule: function(...) { ... },
  default: function(...) { ... }
}
运行此脚本时,出现以下错误:

/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/async.js:61
        fn = function () { throw arg; };
                           ^

TypeError: jsonRulesEngine is not a constructor
    at Object.verify (/Users/Nag/Code/learn-nodejs/server/api/services/RulesService.js:21:27)
    at Object.wrapper [as verify] (/Users/Nag/Code/learn-nodejs/server/node_modules/@sailshq/lodash/lib/index.js:3250:19)
    at /Users/Nag/Code/learn-nodejs/server/api/controllers/UtilsController.js:113:43
    at /Users/Nag/Code/learn-nodejs/server/api/services/RedisService.js:55:13
    at tryCatcher (/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/util.js:16:23)
    at Promise.successAdapter [as _fulfillmentHandler0] (/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/nodeify.js:23:30)
    at Promise._settlePromise (/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/promise.js:566:21)
    at Promise._settlePromise0 (/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/promise.js:693:18)
    at Async._drainQueue (/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/async.js:133:16)
    at Async._drainQueues (/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/async.js:143:10)
    at Immediate.Async.drainQueues (/Users/Nag/Code/learn-nodejs/server/node_modules/bluebird/js/release/async.js:17:14)
    at Immediate.<anonymous> (/Users/Nag/Code/learn-nodejs/server/node_modules/async-listener/glue.js:188:31)
    at runCallback (timers.js:666:20)
    at tryOnImmediate (timers.js:639:5)
    at processImmediate [as _immediateCallback] (timers.js:611:5)
[nodemon] app crashed - waiting for file changes before starting...
/Users/Nag/code/learn nodejs/server/node_modules/bluebird/js/release/async.js:61
fn=函数(){throw arg;};
^
TypeError:jsonRulesEngine不是构造函数
在Object.verify(/Users/Nag/Code/learn nodejs/server/api/services/RulesService.js:21:27)
在Object.wrapper[as verify](/Users/Nag/Code/learn nodejs/server/node_modules/@sailshq/lodash/lib/index.js:3250:19)
at/Users/Nag/Code/learn nodejs/server/api/controllers/UtilsController.js:113:43
at/Users/Nag/Code/learn nodejs/server/api/services/RedisService.js:55:13
在tryCatcher(/Users/Nag/Code/learn nodejs/server/node_modules/bluebird/js/release/util.js:16:23)
在Promise.successAdapter[as _fulfillmentHandler0](/Users/Nag/Code/learn nodejs/server/node_modules/bluebird/js/release/nodeify.js:23:30)
在Promise._结算Promise(/Users/Nag/Code/learn nodejs/server/node_modules/bluebird/js/release/Promise.js:566:21)
在Promise._settlePromise0(/Users/Nag/Code/learn nodejs/server/node_modules/bluebird/js/release/Promise.js:614:10)
在Promise._结算Promises(/Users/Nag/Code/learn nodejs/server/node_modules/bluebird/js/release/Promise.js:693:18)
在Async.\u drainQueue(/Users/Nag/Code/learn nodejs/server/node\u modules/bluebird/js/release/Async.js:133:16)
在Async.\u drainQueues(/Users/Nag/Code/learn nodejs/server/node\u modules/bluebird/js/release/Async.js:143:10)
位于Immediate.Async.drainQueues(/Users/Nag/Code/learn nodejs/server/node_modules/bluebird/js/release/Async.js:17:14)
马上。(/Users/Nag/Code/learn nodejs/server/node_modules/async listener/glue.js:188:31)
运行回调时(timers.js:666:20)
在tryOnImmediate(timers.js:639:5)
在processImmediate[as_immediateCallback](timers.js:611:5)
[nodemon]应用程序崩溃-正在等待文件更改,然后再启动。。。

知道我为什么会犯那个错误吗?在包的示例部分,包的所有者使用ES6格式导入包,而我需要它。这会有区别吗?

当您需要NPM软件包时,根据您的模块系统1,执行此操作时,默认导出不会自动导入:

因此,当您像以前那样需要时,它将返回模块对象,而不一定是预期的默认导出。在包
json规则包
中,默认情况下导出
引擎
,但您的require不需要默认值。如果记录返回的模块对象,它将如下所示:

// Require and initialize the rules engine
var jsonRulesEngine = require('json-rules-engine'),
    rulesEngine = new jsonRulesEngine();
{
  Engine: function(...) { ... },
  Fact: function(...) { ... },
  Operator: function(...) { ... },
  Rule: function(...) { ... },
  default: function(...) { ... }
}
引擎位于属性
default
engine
下。你可以做:

var jsonRulesEngine = require('json-rules-engine').default();
或:

第一个将显式导入默认导出。然后您可以创建类的实例,如下所示:

var rulesEngine = new jsonRulesEngine();


1是,使用ES2015
导入将影响结果。如果使用ES2015中的
import
语法,则不会遇到此问题。要知道为什么要看。简而言之,Babel传输ES2015代码,以便在需要导入默认导出时显式访问
default

当您需要NPM包时,根据您的模块系统1,执行以下操作时,默认导出不会自动导入:

因此,当您像以前那样需要时,它将返回模块对象,而不一定是预期的默认导出。在包
json规则包
中,默认情况下导出
引擎
,但您的require不需要默认值。如果记录返回的模块对象,它将如下所示:

// Require and initialize the rules engine
var jsonRulesEngine = require('json-rules-engine'),
    rulesEngine = new jsonRulesEngine();
{
  Engine: function(...) { ... },
  Fact: function(...) { ... },
  Operator: function(...) { ... },
  Rule: function(...) { ... },
  default: function(...) { ... }
}
引擎位于属性
default
engine
下。你可以做:

var jsonRulesEngine = require('json-rules-engine').default();
或:

第一个将显式导入默认导出。然后您可以创建类的实例,如下所示:

var rulesEngine = new jsonRulesEngine();


1是,使用ES2015
导入将影响结果。如果使用ES2015中的
import
语法,则不会遇到此问题。要知道为什么要看。简而言之,巴贝尔传输ES2015代码,以便在需要导入默认导出时显式访问
default

@AndrewLi尝试了您的建议,但现在它说
TypeError:不能将类作为函数调用
@AndrewLi像var-Engine=require('json-rules-Engine')。Engine();`. 你最初的评论是正确的。如果按原样添加,很高兴将其标记为答案。我错了,
引擎默认导出。我对答案进行了编辑,以反映真正的原因。@AndrewLi尝试了你的建议,但现在它说
TypeError:不能将类作为函数调用
@AndrewLi我犯了一个错误,像var Engine=require('json-rules-Engine')。Engine();`。你最初的评论是正确的。如果按原样添加,很高兴将其标记为答案。我错了,
引擎默认导出。我编辑了答案以反映真正的原因。