node.js - Как передать данные из контроллера в промежуточное ПО в expressjs? - PullRequest
0 голосов
/ 30 июня 2019

У меня есть электронное приложение, которое мне нужно для обслуживания файлов из определенного каталога. но адрес, если этот каталог обнаружен только во время выполнения. Итак, я сделал это промежуточное ПО:

app.use("/vids", (req, res, next) => {
  return express.static(the_root)(req, res, next);
});

Вот часть моего контроллера, которая обнаруживает рут.

exports.joe = (req, res) => {
  const {dialog} = require("electron");
  dialog.showOpenDialog(
    {
      filters: [
        {name: "Anchor", extensions: ["anchor"]},
        {name: "All Files", extensions: ["*"]},
      ],
      properties: ["openFile"],
    },
    (loc) => {
      fs.writeFile(locfile, loc, function(err) {
        if (err) {
          return console.log(err);
        }
        console.log("The new root location saved: " + loc);
      });
      res.redirect("/pie");
    },
  );
};
exports.pie = (req, res) => {
    res.render('91')
}

А потом в 91 шаблоне у меня есть:

<img src="image.png">

Пользователь выберет путь: /mnt/dir/ И файл находится в /mnt/dir/image.png

Я хотел бы иметь возможность каким-то образом передать адрес /mnt/dir/ промежуточному программному обеспечению, чтобы при запросе на получение изображения промежуточное программное обеспечение знало, где искать. Как это возможно? Я думал как-то поместить данные в объект запроса, но не знаю как.

1 Ответ

1 голос
/ 30 июня 2019

Учитывая общую архитектуру Express, это похоже на опцию конфигурации приложения, которая была бы естественной для app.get() и app.set().

Добавить app.set(), чтобы сохранить эту конфигурацию в объекте приложения:

exports.joe = (req, res) => {
  const {dialog} = require("electron");
  dialog.showOpenDialog(
    {
      filters: [
        {name: "Anchor", extensions: ["anchor"]},
        {name: "All Files", extensions: ["*"]},
      ],
      properties: ["openFile"],
    },
    (loc) => {
      fs.writeFile(locfile, loc, function(err) {
        if (err) {
          return console.log(err);
        }

        // save this on the app object as a configuration
        req.app.set("imageDir", loc);

        console.log("The new root location saved: " + loc);
      });
      res.redirect("/pie");
    },
  );
};

Затем в промежуточном программном обеспечении вы можете получить его в любое время:

app.use("/vids", (req, res, next) => {
  return express.static(app.get("imageDir"))(req, res, next);
});

Это также предполагает, что app.set("imageDir", ...) вызывается при запуске, чтобы установить для него некоторое функциональное значение.


Есть множество других способов сделать это.

  1. Вы можете установить или изменить переменную среды в process.env, а затем извлечь ее оттуда, когда это необходимо.
  2. Вы можете сохранить каталог как локальный модуль, а затем экспортировать функцию, которая будет возвращать текущее значение этой переменной в любое время.
  3. Вы могли бы создать промежуточное программное обеспечение ранней стадии, которое установило бы каталог как пользовательское свойство для объекта req, чтобы все последующие промежуточные программы могли получить к нему доступ. Похоже, это была ваша первая мысль о том, как это сделать. Это не мой фаворит, потому что на самом деле это просто параметр конфигурации, поэтому кажется более естественным обращаться с ним, как с другими параметрами конфигурации с app.get() или двумя вышеуказанными параметрами.
  4. Вы можете установить глобальное свойство global.imageDir, к которому можно получить доступ из любого места.

К вашему сведению, в вашем коде showOpenDialog() отсутствует проверка на отмену диалога.

...