{ scraperDate = stats.mtime.to-6ren">
gpt4 book ai didi

javascript - 为什么 NodeJS 中的这个导出函数不能按我想要的方式工作?

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:40 25 4
gpt4 key购买 nike

我试图让下面的代码从导出的函数作为中间件运行。

fs.stat("./tmp/my_data.json", (err, stats) => {
scraperDate = stats.mtime.toUTCString();
});

我有

let scraperDate = "";

在我的路线文件顶部。我正在尝试这样做:

router.get("/", myFunctions.scraperDateFunction, function (req, res) {
res.render("my_view", {scraped: scraped, scraperDate: scraperDate});
});

当我按原样运行 scraperDate 代码时,在路线上方,它就可以工作。当我将其放入到 module.exports 的functions.js 文件中时,它不会写入 scraperDate 变量。

我可能在这里遗漏了一些明显的东西,但我已经尝试让它在两天的大部分时间里发挥作用。这是我的 module.exports 功能:

module.exports = {
scraperDateFunction: function(){
fs.stat("./tmp/my_data.json", (err, stats) => {
scraperDate = stats.mtime.toUTCString();
});
}
}

* 编辑 *

我现在已经尝试过这个

getScrapeDate: function(req, res, next){
fs.stat("./tmp/my_data.json", (err, stats) => {
scraperDate = stats.mtime.toUTCString();
console.log(err)
console.log(stats)
return next;
});
}

按预期打印 stats 来控制台,没有任何错误。这可能与范围有关。我将如何传递 stats.mtime.toUTCString(); 的结果 到路由中的 scraperDate 变量?

* 编辑 2 *

现在我的函数文件中有这个

    getScrapeDate: function(req, res, next){
fs.stat("./tmp/my_data.json", (err, stats) => {
if (err) {
next (err);
} else {
res.locals.scraperDate = stats.mtime.toUTCString()
}

});
}

按照建议,这在我的路线文件中,但它不会加载我的 View

router.get("/", myFunctions.getScrapeDate, function (req, res) {
let {scraperDate} = res.locals;
res.render("my_view", {scraped: scraped, scraperDate:
scraperDate});
});

scraped 在路由文件的顶部声明。

*最终编辑*

这是一个正在运行的设置

router.get("/", myFunctions.getScrapeDate, function (req, res) {
let {scraperDate} = res.locals;
res.render("my_view", {scraped, scraperDate});
});

    getScrapeDate: function(req, res, next){
fs.stat("./tmp/my_data.json", (err, stats) => {
if (err) {
next (err);
} else {
res.locals.scraperDate = stats.mtime.toUTCString();
next();
}
});
}

最佳答案

不要在函数模块的顶部定义 scraperDate ,也不要尝试将其导入到路由模块中。最好的情况是,这只是代码味道,最坏的情况是,您最终会无意中在单独的请求响应周期之间泄漏不应共享的信息。

你应该做的是关注this recommendation使用 res.locals 在中间件之间传递数据:

在你的路由文件中:

router.get('/', myFunctions.scraperDateFunction, (req, res) => {
const { scraperDate } = res.locals;
// the following is shorthand in ES2015 syntax for
// { scraped: scraped, scraperDate: scraperDate }
res.render('my_view', { scraped, scraperDate });
});

在你的函数文件中:

module.exports = {
scraperDateFunction (req, res, next) {
fs.stat('./tmp/my_data.json', (err, stats) => {
if (err) {
next(err);
} else {
res.locals.scraperDate = stats.mtime.toUTCString();
next();
}
});
}
}

再次强调,不要尝试在函数文件中定义和导出顶级 scraperDate 变量,这是在中间件之间以 Express 方式传递数据的更简洁的方法。

关于javascript - 为什么 NodeJS 中的这个导出函数不能按我想要的方式工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59060231/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com