【问题标题】:Node.js require cachingNode.js 需要缓存
【发布时间】:2015-02-21 17:16:04
【问题描述】:

我真的被 nodejs 缓存系统卡住了。我的项目有这个结构:

Project/
    apps/
        jobs_processor/
            app.js
            processors.js
            processors/
    libs/
        queue_manager.js

queue_manager.js 需要processors.js

var processors = require("../apps/jobs_processor/processors.js");

app.js 还需要processor.js

var processors = require("./processors.js");

如果我考虑到文档,我必须有相同的路径才能获得相同的对象,对吗?如果是这样,我该如何实现(具有相同的路径)?

谢谢。

编辑:

如果找到解决我的问题的方法。 这是queue_manager.js文件的第一个版本

var _ = require("lodash");

var Utils = require("./utilities");
var Processors = require("../apps/jobs_processor/processors");
var Logger = require("./logger");

var QUEUES_CACHE = {};

exports.createJob = createJob;
exports.getCacheObject = getCacheObject;

function createJob(name, data) {
  var cacheId = name.replace(/ /g, "_");

  Logger.info("Cache ID: " + cacheId);

  if (!QUEUES_CACHE[ cacheId ]) {
    _.each(Processors, function (processor) {
      Logger.debug("PROCESSOR NAME: " + processor.name);
      Logger.debug("JOB NAME: " + name);

      if (processor.name === name)
        QUEUES_CACHE[ cacheId ] = processor;
    });

    if (!QUEUES_CACHE[ cacheId ])
      throw new Error("Processor for job \"" + name + "\" not found.");
  }

  Logger.debug(Object.keys(QUEUES_CACHE));

  return QUEUES_CACHE[ cacheId ].queue.add(data);
}

function getCacheObject() {
  return QUEUES_CACHE;
}

现在是同一个文件的最后一个版本

var _ = require("lodash");

var Utils = require("./utilities");
var Logger = require("./logger");

exports.createJob = createJob;

function createJob(name, data) {
  var Processors = require("../apps/jobs_processor/processors");
  var processor;

  _.each(Processors, function (element) {
    Logger.debug("Processor name: " + element.name);

    if (element.name === name)
      processor = element;
  });

  return processor.queue.add(data);
}

每次我调用createJob 方法时,我都需要processors 模块,它是我创建的每个作业处理器的数组。

【问题讨论】:

    标签: javascript node.js caching require


    【解决方案1】:

    Node.js 将在缓存模块之前解析路径。
    只要您的相对路径解析为磁盘上相同的绝对路径,就可以了。

    【讨论】:

    • 在我的示例中,相对路径不同,因此缓存中有 2 个对象
    • @igorissen:错了。缓存由已解析的绝对路径作为键,这将是相同的。
    • 这很奇怪,因为我在 queue_manager.js 中记录了一个对象,当调用 createJob 方法时,我有 2 个不同的对象。
    • 运行 console.log(require.cache) 并查看缓存中的内容。
    • 我只记录require.cache,就像你说的只有一个/Users/fluxb0x/Projects/my-project/libs/queue_manager.js 文件。但我在其他模块({"/Users/fluxb0x/Projects/my-project/module.js": {"parent": {"id":"/Users/fluxb0x/Projects/my-project/libs/queue_manager.js", ...} } })中发现了与parent 相同的模块。主模块和父模块有区别吗?还是父模块只是到主模块的链接?
    猜你喜欢
    • 1970-01-01
    • 2020-07-19
    • 1970-01-01
    • 2014-07-04
    • 1970-01-01
    • 2010-12-24
    • 2012-06-17
    • 2012-08-25
    • 2013-04-13
    相关资源
    最近更新 更多