【问题标题】:Meteor.js - Production Meteor.settings throws TypeError undefinedMeteor.js - 生产 Meteor.settings 抛出未定义的 TypeError
【发布时间】:2014-11-13 17:19:04
【问题描述】:

我是 Meteor 的新手,正在设置开发、舞台和生产 Meteor.settings。

使用“开发”设置在我的本地系统上一切正常,但是当我捆绑它并在 Digital Ocean 上运行时,它会中断。如果我删除了对设置文件的调用,并将其替换为文本字符串,一切正常。

这是设置文件,名为“1_settings.js”,在所有其他 js 文件之前加载(至少在理论上?):

console.log("=> inside 1_settings.js"); 

environment = process.env.NODE_ENV || "development";

var settings = {
  development: {
    public: {},
    private: {

      "firstUser": {
        "id": "ZsKaw3kSbQ4uSvzJg"
      },

    }
  },
  staging: {
    public: {},
    private: {}
  },
  production: {
    public: {},
    private: {

      "firstUser": {
        "id": "oPMfpAuwQ3nuTdpTA"
      },

    }
  }
};

if (!process.env.METEOR_SETTINGS) {
  console.log("=> No METEOR_SETTINGS passed in, using locally defined settings.");

  if (environment === "production") {
    Meteor.settings = settings.production;
  } else if (environment === "staging") {
    Meteor.settings = settings.staging;
  } else {
    Meteor.settings = settings.development;
  }

  // Push a subset of settings to the client.
  if (Meteor.settings && Meteor.settings.public) {
    __meteor_runtime_config__.PUBLIC_SETTINGS = Meteor.settings.public;
  }
}

这里是我使用设置的地方:

如果(Meteor.isServer){

var settings = Meteor.settings.private;

console.log("=> settings: " + JSON.stringify(settings));

Meteor.startup(function () {
    // bootstrap the admin user if they exist -- You'll be replacing the id later
    if (Meteor.users.findOne(settings["firstUser"]["id"]))
        Roles.addUsersToRoles(settings["firstUser"]["id"], ['admin']);

如你所见,它打破了上面代码的第二个“if”语句,我在这里调用了 settings["firstUser"]["id"],如下面的错误所示:

TypeError: Cannot read property 'firstUser' of undefined
    at app/server/app.startup.js:8:42
    at /home/qdev/bundle/programs/server/boot.js:175:5

/home/qdev/bundle/programs/server/node_modules/fibers/future.js:173
                                            throw(ex);
                                                  ^

显然,我知道设置属性未定义或为空。我不明白为什么?即使我没有设置 $NODE_ENV=production(我有),它应该仍然回退到开发设置。感谢您的帮助!

【问题讨论】:

  • 我看到您正在检查 METEOR_SETTINGS 以确保它没有设置。也许这是出于某种原因在您的生产环境中设置的。

标签: node.js meteor bundle production digital-ocean


【解决方案1】:

你用错了Meteor.settings。它应该由你指定的运行时设置由流星本身填充。

为此,您应该创建一个包含您的设置的 JSON 文件,然后在调用流星进行开发时使用 --settings #pathtofile# 参数。确保它是有效的 JSON!

这将正确填充Meteor.settings,并且还可以让您稍后更改设置。

在服务器上,您使用环境变量指向设置文件。 Eventedmind 制作了一个关于如何设置的视频:link

【讨论】:

    猜你喜欢
    • 2022-09-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-25
    • 2017-08-14
    • 2023-01-30
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多