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

标签 node.js express mongoose pug

我创建了一个处理动态助手的外部文件,其中包含我希望能够从我的所有 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/

相关文章:

javascript - UnhandledPromiseRejectionWarning : Error: URI does not have hostname, 域名和顶级域名

javascript - 使用 Mongoose 在 Handlebars 中渲染额外数据

javascript - 为什么我无法在Socket.IO中保存当前房间?

javascript - 我可以在 Node.js 微服务中使用多个事件循环吗?

javascript - 为什么即使 0 不在范围内,函数的输出也是 0?

node.js - Express/Node.JS 中间件引发错误,继续处理

javascript - Expressjs 不会破坏 session

javascript - socket.io:点击时发出按钮的属性值?

node.js - 使用 Flightplan 和 Bower 进行部署

javascript - 无法在 Mongoose 回调中保存