【问题标题】:Why does this NPM package say it is not a constructor?为什么这个 NPM 包说它不是构造函数?
【发布时间】:2017-05-06 01:58:12
【问题描述】:

我正在开发一个 Sails.js 项目,该项目需要我使用 this NPM package。我创建了一个新的 Sails.js 服务来在 npm install-ing 之后调用这个包,如下所示:

// Require and initialize the rules engine
var jsonRulesEngine = require('json-rules-engine'),
    rulesEngine = new jsonRulesEngine();

当我运行此脚本时,我收到以下错误:

/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...

任何线索为什么我会得到这个错误?在包的示例部分,包的所有者使用 ES6 格式导入包,而我需要它。这有什么不同吗?

【问题讨论】:

  • @AndrewLi 尝试了您的建议,但现在显示为TypeError: Cannot call a class as a function
  • @AndrewLi 我犯了一个错误,把它叫做 var Engine = require('json-rules-engine').Engine();`。你原来的评论是正确的。如果您按原样添加,很高兴将其标记为答案。
  • 我错了,Engine 默认导出的。我已经编辑了答案以反映真正的原因。

标签: node.js npm


【解决方案1】:

当你需要一个 NPM 包时,根据你的模块系统1,默认导出在你这样做时不会自动导入

var jsonRulesEngine = require('json-rules-engine');

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

{
  Engine: function(...) { ... },
  Fact: function(...) { ... },
  Operator: function(...) { ... },
  Rule: function(...) { ... },
  default: function(...) { ... }
}

引擎在属性defaultEngine下。你可以这样做:

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

或者:

var jsonRulesEngine = require('json-rules-engine').Engine;

第一个将显式导入默认导出。然后你可以像这样创建一个类的实例:

var rulesEngine = new jsonRulesEngine();

1是的,使用 ES2015 import 会影响结果。如果你使用 ES2015 中的 import 语法,就不会遇到这个问题。要知道为什么请参阅this answer。简而言之,Babel 转译 ES2015 代码,以便在需要导入默认导出时显式访问 default

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-29
    • 1970-01-01
    • 2021-06-23
    • 2013-04-25
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2013-07-28
    相关资源
    最近更新 更多