为什么 NodeJS 中的这个导出函数不能按我想要的那样工作?
Why is this exported function in NodeJS not working as I want it to?
我正在尝试将 运行 下面的代码作为导出函数的中间件。
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 代码时,在路线上方,它起作用了。当我将它放入 functions.js 文件到 module.exports 时,它不会写入 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()
}
});
}
这在我的路线文件中按照建议但它不会加载我的视图
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();
}
});
}
模块中 scraperDateFunction
内的 scraperDate
变量未导出,因为不同模块之间不共享作用域。这会破坏模块的全部用途。
不要在函数模块的顶部定义 scraperDate
,也不要尝试将其导入到路由模块中。最好的情况是代码味道,最坏的情况是你最终会在单独的请求-响应周期之间无意中泄露信息,这些信息应该不被共享。
你应该做的是遵循this recommendation to pass data between middleware using 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 中的中间件之间传递数据的一种更简洁的方法。
我正在尝试将 运行 下面的代码作为导出函数的中间件。
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 代码时,在路线上方,它起作用了。当我将它放入 functions.js 文件到 module.exports 时,它不会写入 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()
}
});
}
这在我的路线文件中按照建议但它不会加载我的视图
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();
}
});
}
模块中 scraperDateFunction
内的 scraperDate
变量未导出,因为不同模块之间不共享作用域。这会破坏模块的全部用途。
不要在函数模块的顶部定义 scraperDate
,也不要尝试将其导入到路由模块中。最好的情况是代码味道,最坏的情况是你最终会在单独的请求-响应周期之间无意中泄露信息,这些信息应该不被共享。
你应该做的是遵循this recommendation to pass data between middleware using 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 中的中间件之间传递数据的一种更简洁的方法。