javascript - 需要相同的模块,不同的路径,变量不共享

标签 javascript node.js caching require

我真的不知道 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

有什么建议我如何需要具有不同路径的相同模块,并且仍然具有相同的变量?

谢谢。

最佳答案

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

更改测试 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

这将为您带来预期的结果。

关于javascript - 需要相同的模块,不同的路径,变量不共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31937131/

相关文章:

javascript - 如何自动滚动到 ListView 项目

javascript - 处理dojo EdgeToEdgeStoreList事件

javascript - 在 AngularJS 中执行 $http.post 查询后返回 2 个表

html - element.addEventListener不添加监听器

javascript - 如何从源代码(而不是 bundle )运行 Electron 应用程序

sql - 使用数据透视表加快计数 (*)

javascript - jQuery 照片轮播(看起来像真正的轮播)?

node.js - 将 grunt 添加到 dev-dependency 时无法解析 json

javascript - 如何在给定的休息调用中使用 'cache: true' ?

ios - 将 UIImage 对象放入系统缓存中?