繁体   English   中英

node.js-如何将数据从控制器传递到expressjs中的中间件?

[英]node.js - How to pass data from controller to middleware in expressjs?

我有一个电子应用程序,需要从某个目录提供文件。 但是该地址(如果仅在运行时发现该目录)。 所以我做了这个中间件:

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/地址传递给中间件,以便在发出检索图像的请求时,中间件知道在哪里查看。 这怎么可能? 我当时想将数据以某种方式放入请求对象中,但我不知道如何。

鉴于Express的一般体系结构,这感觉就像是app.get()app.set()的自然应用配置选项。

添加app.set()以将此配置保存在app对象上:

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()代码似乎缺少对要取消的对话框的检查。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM