(Node.js / Express) MongoDB соединяет разные базы данных для разных сред (Google App Engine) - PullRequest
0 голосов
/ 28 апреля 2020

Цель:

В настоящее время я пытаюсь настроить демонстрационную и демонстрационную среду для своего приложения. Я использую Google App Engine и развертываю для каждого из них другой URL-адрес и проект App Engine. Идея состоит в том, что каждый экземпляр подключается к своему собственному URL-адресу в зависимости от среды.

Проблема:

В настоящее время проблема заключается в том, что, хотя я вижу в журналах консоли, что приложения действительно получают правильные Переменные среды каждый экземпляр пытается читать и записывать в производственную базу данных.

Консоль даже регистрирует «Подключено к базе данных: демонстрация / подготовка в демонстрационной или промежуточной среде. Тем не менее я получаю коллекции и данные из рабочей базы данных.

Это не так для локального запуска приложения, когда оно подключается к промежуточной базе данных (переменная среды для NODE_ENV при локальном запуске не определена)

Код:

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

production.yaml

runtime: nodejs10
env: standard
instance_class: F1
handlers:
  - url: /favicon\.ico
    static_files: favicon.ico
    upload: favicon.ico

  - url: /static
    static_dir: public

  - url: /.*
    secure: always
    redirect_http_response_code: 301
    script: auto

automatic_scaling:
  min_idle_instances: 1
  max_idle_instances: 3
  min_instances: 1
  min_pending_latency: automatic
  max_pending_latency: automatic
network: {}
env_variables:
  NODE_ENV: production
  LOGIN_PAGE: https://login.myproductionurl.com/
  API_ENDPOINT: https://myproductionurl.appspot.com/
  PORT: 8080

Демонстрация и Staging имеют аналогичную настройку с изменением переменных среды, установленным для их дела.

demo.yaml

...
env_variables:
  NODE_ENV: demo
  LOGIN_PAGE: https://login.mydemourl.com/
  API_ENDPOINT: https://mydemourl.appspot.com/
  PORT: 8080

staging.yaml

...
env_variables:
  NODE_ENV: staging
  LOGIN_PAGE: https://login.mystagingurl.com/
  API_ENDPOINT: https://mystagingurl.appspot.com/
  PORT: 8080

В Express Затем я пытаюсь подключиться к другой базе данных MongoDB в Cloud Atlas на основе переменной среды.

Подключение к базе данных на сервере. js

 if (process.env.NODE_ENV === "demo") {
    console.log("Connecting to Database: Demo");
    mongoose.connect(
     "mongodb+srv://(myusername):(mypassword)@(myucluster).mongodb.net/demo",
      { useNewUrlParser: true }
    );
  } else if (process.env.NODE_ENV === "production") {
    console.log("Connecting to Database: Production");
    mongoose.connect(
      "mongodb+srv://(myusername):(mypassword)@(myucluster).mongodb.net/production",
      { useNewUrlParser: true }
    );
  } else {
    console.log("Connecting to Database: Staging");
    mongoose.connect(
      "mongodb+srv://(myusername):(mypassword)@(myucluster).mongodb.net/staging",
      { useNewUrlParser: true }
    );
  }

  const db = mongoose.connection;
  db.on("error", (error) => console.error(error));
  db.once("open", () => console.log("connected to database"));

  server.set("database", db);

Дополнительная информация:

Там нет подключений, указанных где-либо еще в проекте. enter image description here

1 Ответ

2 голосов
/ 28 апреля 2020

Похоже, что имя БД для кластеров отличается от mon goose do c говорит

Вы должны использовать вместо dbname в строке подключения, используйте параметр dbName :

mongoose.connect('mongodb+srv://(un):(pw)@(cluster).mongodb.net/staging', { dbName: 'staging' });

Соответствующий ответ Не удалось подключить пн goose к атласу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...