我创建了一个处理动态帮助程序的外部文件,其中包括一堆我希望能够从我的所有视图中使用的函数。
在这些功能中,我正在运行一个查询并从数据库中获取标签,我想在我的 layout.jade 文件中使用这些标签(所有其他视图都在使用)。在控制台中,一切似乎都很好。查询返回标签对象,但由于某种奇怪的原因,我无法将对象返回到视图,这给了我一条错误消息,告诉我“标签”未定义”。
这是我的文件 dynamicHelpers.js 中的代码:
exports.tags = function(req, res){
var environment = require('../environment');
var service = require('../service');
service.init(environment);
var model = service.useModel('tag');
var query = model.Tag.find({});
query.exec(function (err, tags) {
if (err) {
console.log(err);
// do something
}
console.log(tags);
return tags;
});
}
在 layout.jade 我以这种方式获取对象(这显示未定义):
p
#{tags}
我真正想做的是用'each'遍历所有标签。因此,后续问题是是否允许并且可能(如果“标签”未定义)?
ul.tags
each tag in #{tags}
a(href='/tag/' + tag._id.toHexString())
li.tag= tag.name
更新: 我已经尝试过@Linus G Thiel 的解决方案(见下文),但无法使其工作(res.tags 未定义)。使用中间件中的 console.log(tags),它会打印出对象。但是,在下面的 dynamicHelper 函数中,它是未定义的。似乎 res.tags 由于某种原因没有传递给 dynamicHelper 。
动态助手.js:
exports.tags = function(req, res) {
console.log(req.tags); <--- undefined
return req.tags;
};
配置.js:
module.exports = function(app, express, next){
app.configure(function() {
// lots of more app.use functions (eg. express.cookieParser());)
// ...
app.use(function(req, res, next) {
var environment = require('./environment');
var service = require('./service');
service.init(environment);
var model = service.useModel('tag');
var query = model.Tag.find({});
query.exec(function (err, tags) {
if (err) {
return next(err);
}
req.tags = tags;
next();
console.log(req.tags); <--- works fine
});
});
});
};