【问题标题】:Same module required, different path, variables not shared需要相同的模块,不同的路径,不共享的变量
【发布时间】:2015-11-03 09:42:56
【问题描述】:

我真的很迷茫require 的工作原理,我试图找出真相。 Nodejs 文档说每次你需要相同的模块(不同的路径或不同的路径)你都会得到相同的对象。但对我来说,即使我需要相同的模块,这也不是同一个对象。

我创建了一个简单的项目来尝试这个,一个内存缓存系统。首先我们有主文件,第一个测试文件用于添加项目,第二个测试文件用于获取添加的项目。

//main.js
var exports = module.exports = {};

var debug = require("debug")("memcache:main");

var CACHE = {};

debug(CACHE);

exports.set = addItem;
exports.get = getItem;

function addItem(key, value) {
  debug(key);
  debug(value);

  CACHE[ key ] = value;

  debug(CACHE[ key ]);
  }
}

function getItem(key) {
  debug(key);
  debug(CACHE[ key ]);

  return CACHE[ key ];
}

添加项目的第一个测试文件

//test/test1.js
var memcache = require("../main");

memcache.set("id1", { name: "lola" });

检索添加项的第二个测试文件

// test/child/test2.js
var memcache = require("../../main");

setInterval(
  function () {
    console.log(memcache.get("id1"));
  },
  3000
);

现在这是控制台输出

MacBook-Pro:memcache fluxb0x$ DEBUG=memcache:* node test/test1.js
  memcache:main {} +0ms
  memcache:main id1 +3ms
  memcache:main { name: 'lola' } +0ms
  memcache:main undefined +1ms
  memcache:main { name: 'lola' } +0ms

MacBook-Pro:memcache fluxb0x$ DEBUG=memcache:* node test/child/test2.js
  memcache:main {} +0ms
  memcache:main id1 +3s
  memcache:main undefined +0ms
undefined
  memcache:main id1 +3s
  memcache:main undefined +0ms
undefined
  memcache:main id1 +3s
  memcache:main undefined +1ms
undefined
  memcache:main id1 +3s
  memcache:main undefined +0ms
undefined
  memcache:main id1 +3s
  memcache:main undefined +0ms
undefined
  memcache:main id1 +3s
  memcache:main undefined +0ms
undefined

任何建议我怎样才能要求具有不同路径的相同模块,并且仍然具有相同的变量?

谢谢。

【问题讨论】:

    标签: javascript node.js caching require


    【解决方案1】:

    您的缓存不是真正的内存缓存,它只是一个保存值的对象。所以它在节点的两次执行中不是持久的。这可以通过对您的代码进行小的更改来证明。

    更改测试 2 文件以公开测试方法

    // test/child/test2.js
    var memcache = require("../../main");
    
    exports.test = function(){
       setInterval(
          function () {
            console.log(memcache.get("id1"));
          },
          3000
        );
    }
    

    将值添加到缓存后,在 test1 中使用暴露的测试方法。

    //test/test1.js
    var memcache = require("../main");
    var test2 = require("./child/test2");
    
    memcache.set("id1", { name: "lola" });
    test2.test();
    

    然后像你一样运行 test1。

    $ DEBUG=memcache:* node test/test1.js

    这会给你预期的结果。

    【讨论】:

    • 谢谢。我现在明白为什么我无法获得对象值。我真正的问题是我的应用程序使用我的CacheManager 和一个每天运行的脚本来用新数据更新 2 个键值。我认为在脚本中添加一个函数来获取相同的对象实例是不干净的。有什么解决办法吗?
    • 我在我的缓存管理器var NodeCache = require("node-cache"); var myCache = new NodeCache() 中使用node-cache,并在应用程序和脚本中通过module.exports = myCache; 导出缓存我需要CacheManager 模块var CacheManager = require("../../lib/cache_manager");var CacheManager = require("../app/lib/cache_manager");
    • 您能否单独发布一个包含所有详细信息和相关代码的问题。
    • 很抱歉再次发帖,但我没有可用的编辑权限。这是new question的链接
    猜你喜欢
    • 2017-05-23
    • 2019-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-25
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多