Загрузить пользовательскую конфигурацию во время выполнения - PullRequest
0 голосов
/ 05 июня 2019

У меня есть приложение nuxt, в которое мне нужно будет добавить данные из сгенерированного файла конфигурации при первом запуске приложения. Причина, по которой я не могу сделать это в реальной сборке, заключается в том, что файл конфигурации на данный момент не существует; он генерируется непосредственно перед вызовом npm start скриптом начальной загрузки.

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

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

# part of nuxt.config.js
  hooks: {
    listen(server, listener) {
      # load the custom configuration file.
      fs.readFile('./config.json', (err, data) => {
        let configData = JSON.parse(data));
      });
    }
  },

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

Я также попытался использовать плагин для решения этой проблемы:

import axios from ‘axios’;

export default function (ctx, inject) {
  // server-side logic
  if (ctx.isServer) {
    // here I would like to simply use fs.readFile to load the configuration, but this is not working?
  } else {
    // client-side logic
    axios.get(‘/config.json’)
      .then((res) => {
        inject(‘storeViews’, res.data);
    });
  }
};

В приведенном выше коде у меня проблемы как с использованием модуля fs, так и axios.

Я также думал об использовании промежуточного программного обеспечения для этого, но не знал, как поступить.

1 Ответ

0 голосов
/ 22 июля 2019

Если у кого-то есть такая проблема, вот решение, которое я придумал в итоге:

// plugins/config.js
class Settings
{
  constructor (app, req) {
    if (process.server) {
      // Server side we load the file simply by using fs
      const fs = require('fs');
      this.json = fs.readFileSync('config.json');
    } else {
      // Client side we make a request to the server
      fetch('/config')
        .then((response) => {
          if (response.ok) {
            return response.json();
          }
        })
        .then((json) => {
          this.json = json;
        });
       }
     }
}

export default function ({ req, app }, inject) {
  inject('config', new Settings(app, req));
};

Чтобы это работало, нам нужно использовать промежуточное ПО сервера:

// api/config.js
const fs = require('fs');
const express = require('express');
const app = express();

// Here we pick up requests to /config and reads and return the
// contents of the configuration file
app.get('/', (req, res) => {
  fs.readFile('config.json', (err, contents) => {
    if (err) {
      throw err;
    }
    res.set('Content-Type', 'application/json');
    res.end(contents);
  });
});

module.exports = {
  path: '/config',
  handler: app
};
...