gpt4 book ai didi

node.js - 返回的对象未定义,使用 dynamicHelpers

转载 作者:搜寻专家 更新时间:2023-11-01 00:19:02 25 4
gpt4 key购买 nike

我创建了一个处理动态助手的外部文件,其中包含我希望能够从我的所有 View 中使用的一堆函数。

在其中一个函数中,我正在运行查询并从数据库中获取标签,我想在我的 layout.jade 文件(所有其他 View 都在使用)中使用这些标签。在控制台中,一切似乎都正常。查询返回标签对象,但由于某些奇怪的原因我无法将对象返回到 View ,这给了我一条错误消息,告诉我“标签”未定义。

这是我的文件 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。

dynamicHelpers.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
});
});
});
};

最佳答案

正如@Exploit 所说 in his comment ,您的 tags 函数对 query.exec 进行异步调用,该调用将在您的 tags 函数返回后完成。 Express 的 helpersdynamicHelpers 不能异步,因此您需要以某种方式重构它。一种方法是将它放在早期中间件或路由中的 req 上,然后有一个简单的 dynamicHelper 返回:

dynamicHelpers.js:

exports.tags = function(req, res) {
return req.tags;
};

中间件(您可能不想对所有路由都这样做,您可以查看例如 Route specific middlewareRoute param pre-conditions ):

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();
});
});

关于node.js - 返回的对象未定义,使用 dynamicHelpers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10236476/

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