2014-12-23 82 views
1

我真的被nodejs缓存系统困住了。我有这样的结构,我的项目:Node.js需要缓存

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模块,它是一个数组我创建的每个作业处理器。

回答

3

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

+0

在我的示例中,相对路径不同,因此高速缓存中有2个对象 – Ismael

+0

@igorissen:错误。缓存由已解析的绝对路径键入,这将是相同的。 – SLaks

+0

这很奇怪,因为我在'queue_manager.js'中记录了一个对象,并且在调用'createJob'方法时,我有两个不同的对象。 – Ismael