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">
用户将select路径:/mnt/dir/
该文件位于 /mnt/dir/image.png
我希望能够以某种方式将 /mnt/dir/
地址传递给中间件,以便在发出检索图像的请求时,中间件知道要查看的位置。这怎么可能?
我正在考虑以某种方式将数据放入请求对象中,但我不知道该怎么做。
鉴于 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", ...)
在启动时被调用以将其设置为某个功能值。
还有许多其他方法可以做到这一点。
- 您可以在
process.env
中设置或修改环境变量,然后在需要时从那里检索它。
- 您可以将该目录保存为本地模块,然后导出一个函数,该函数可以随时 return 该变量的当前值。
- 您可以制作一个早期中间件,将目录设置为
req
对象上的自定义 属性,以便所有 follow-on 中间件都可以访问它。听起来这可能是您对如何操作的第一个想法。这不是我最喜欢的,因为它实际上只是一个配置选项,所以像使用 app.get()
或以上两个选项的其他配置选项一样处理它似乎更自然。
- 您可以设置一个可以从任何地方访问的全局 属性、
global.imageDir
。
仅供参考,您的 showOpenDialog()
代码似乎缺少对正在取消的对话框的检查。
我有一个电子应用程序,我需要从某个目录提供文件。但如果该目录仅在运行时发现,则为地址。所以我做了这个中间件:
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">
用户将select路径:/mnt/dir/
该文件位于 /mnt/dir/image.png
我希望能够以某种方式将 /mnt/dir/
地址传递给中间件,以便在发出检索图像的请求时,中间件知道要查看的位置。这怎么可能?
我正在考虑以某种方式将数据放入请求对象中,但我不知道该怎么做。
鉴于 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", ...)
在启动时被调用以将其设置为某个功能值。
还有许多其他方法可以做到这一点。
- 您可以在
process.env
中设置或修改环境变量,然后在需要时从那里检索它。 - 您可以将该目录保存为本地模块,然后导出一个函数,该函数可以随时 return 该变量的当前值。
- 您可以制作一个早期中间件,将目录设置为
req
对象上的自定义 属性,以便所有 follow-on 中间件都可以访问它。听起来这可能是您对如何操作的第一个想法。这不是我最喜欢的,因为它实际上只是一个配置选项,所以像使用app.get()
或以上两个选项的其他配置选项一样处理它似乎更自然。 - 您可以设置一个可以从任何地方访问的全局 属性、
global.imageDir
。
仅供参考,您的 showOpenDialog()
代码似乎缺少对正在取消的对话框的检查。