Express.js - 如何在路由中修改app.locals变量

12

我有一个node.js项目。以下代码是我的app.js文件的一部分。我从数据库中进行查询并将结果存储在名为'Cats'的全局变量中。我使用此变量在网站侧边栏上显示类别。我认为这并不重要,但我正在使用Jade作为模板引擎。

var app = express()

var query = "SELECT * FROM findadoc.categories";
client.execute(query, [], function(err, results) {
  if(err) {
    res.status(404).send({meg: err});
  }
  else {
    app.locals.cats = results.rows;
  }
});

在其中一条路由中,我允许用户将附加类别添加到数据库中。 我需要的是让'apps.locals.cats'变量使用新的类别集进行更新。是否有任何方法可以在我的路由中修改它?我尝试了以下方式,但没有成功。

router.post('/add', function(req, res, next) {
    var cat_id = cassandra.types.uuid();
    var query = "INSERT INTO findadoc.categories(cat_id, name) VALUES (?,?)";
    client.execute(query, [cat_id, req.body.name], {prepare: true},   function(err, results) {
        if(err) {
            res.status(404).send({msg: err});
        } 
        else {
            cats = results.rows;
            req.flash('success', "Category Added");
            res.location('/doctors');
            res.redirect('/doctors');
        }
    });
});

apps是express的一个实例。我正在使用Jade作为模板引擎。我已经更新了问题并提供了这些信息。 - Sohrab Hejazi
你路由器中的 cats 变量绝对不是你的 app.locals.cats - E net4
3
有没有办法在路由中访问 app.locals.cats 变量?如何在 app.js 之外修改它? - Sohrab Hejazi
1
API文档指出,在中间件中无法访问本地变量。我认为,最好采用不涉及应用程序本地变量的不同方法来解决问题。 - E net4
1
@E_net4 现在的手册上写着:“本地变量可以通过 req.app.locals 在中间件中使用” http://expressjs.com/en/4x/api.html#app.locals - steampowered
显示剩余2条评论
1个回答

35

在 Express 4 中,你可以通过 req.appreq 访问到 app。请参见Request object API文档。

通过 req.app.locals(参见 req.app)在中间件中使用本地变量。

在你的中间件中,可以像这样实现:

router.post('/add', function(req, res, next) {
    // do some cool stuff
    req.app.locals.cats = something;
    // more cool stuff
});

你如何直接在视图上使用本地变量? - Raphael Isidro
1
你可以在 res.locals 中向视图公开数据:http://expressjs.com/es/api.html#res.locals - Carlos
3
req.app.locals 中的任何内容都是全局共享的,对于每一个连接都是如此。你不应该在这里存储凭证信息。http://stackoverflow.com/questions/18758158/node-js-is-app-locals-a-global-obj - Jeff Lowery
@Carlos 不需要 req.app.locals.cats,将其设置在 app locals 中即可直接在视图中使用!!!为什么我还要在 res.locals 中再次设置该值呢?你能帮我解决这个问题吗? - pravin poudel
@pravinpoudel 抱歉,自上次我使用Express已经过去5年了。我甚至都不记得locals是什么了。 - Carlos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接