【问题标题】:In Node.js / Express how do I gain access to an object in app.js from a module 2 layers deep?在 Node.js / Express 中,如何从 2 层深的模块访问 app.js 中的对象?
【发布时间】:2021-01-11 11:05:00
【问题描述】:

背景:为了注销用户,我需要访问位于app.js 中的对象redisClient。如何从 2 级深度的模块访问 redisClient?我不知道如何从下游返回redisClient 的新版本。

来自 app.js

const session = require('express-session');
const redis = require('redis');
const redisClient = redis.createClient();
const RedisStore = require('connect-redis')(session);

const myEndpoints = require('./controllers/my-endpoints');
app.use(myEndpoints);

来自 my-endpoints.js

const router = express.Router();
const someMiddleware = require('./some-middleware');
router.get('/logout', someMiddleware.logout);

module.exports = router;

来自 some-middleware.js

exports.logout = function(req, res) {

    // uh oh I'm 2 layers deep.  How do I get to redisClient from here?
    redisClient.del(req.session.id, function(err, response) {
        console.log(err);
    });


    req.session.destroy(function(error) {

        if (error) res.clearCookie(process.env.SESSION_NAME);
        res.redirect('/');

    });
}

【问题讨论】:

  • 我认为你可以用app.set('myClient', redisClient) 存储它,然后用app.get('myClient') 获取它
  • req.app 包含app 对象,因此中间件可以从那里获取应用程序对象。

标签: node.js redis


【解决方案1】:

基于this answer,这是一个简单的修复。感谢 cmets 为我指明了这个方向。

在 app.js 中:

app.set('referenceToRedisClient', redisClient);

在 some-middleware.js 中:

let redisClient = req.app.get('referenceToRedisClient');
await redisClient.del(req.session.id);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-15
    • 2013-12-31
    • 2017-01-26
    相关资源
    最近更新 更多