【问题标题】:Singleton public method getInstance is not a function after being defined单例公共方法getInstance定义后不是函数
【发布时间】:2021-08-11 16:55:04
【问题描述】:

我测试了 DataService 类中的其他功能。我每次都会遇到同样的错误:TypeError: service.getInstance is not a function。

我不确定我做错了什么。我正在尝试创建一个 Singleton 对象来处理我的应用程序的数据服务。

main_app/services/DataService.js

var DataService = (function() {
    
    var TIME = 15000; 
    let Queue = require('../scripts/Queue')
    const uxQueue = new Queue();
    const uxQueue_Buffer =new Queue()
    const queueL1 = new Queue()
    const queueL1_Buffer = new Queue()
    const queueL2 = new Queue()
    const queueL2_Buffer =new Queue()
    const queueL3 = new Queue()
    const queueL3_Buffer =new Queue()
    const queueL4 = new Queue()
    const queueL4_Buffer =new Queue()
    
    const LEVEL_MINUTE = 4; //L1
    const LEVEL_HOUR = 60; //L2
    const LEVEL_DAY = 24; //L3
    const LEVEL_WEEK = 7; //L4
    const UX_LEVEL = 50; //L0 

    //Response for last retrieved data source
    var current_response;

  function queueCheck(queue, level){
    if(level === 0){
        return queue.length === UX_LEVEL;
    }
    if (level === 1){
        return queue.length === LEVEL_MINUTE;
    };
    if(level === 2){
        return queue.length === LEVEL_HOUR;
    };
    if(level === 3){
        return queue.length === LEVEL_DAY; 
    };
    if(level === 4){
        return queue.length === LEVEL_WEEK;
    };
};

function flush(queue){
    var size = queue.length;
    while(!queue.isEmpty()){
        var item = queue.dequeue();
    }
}
//Add item to queue  
function queuer(queue, buffer, level, response){
    if (!queueCheck(queue, level)){ // If queue is not full
            queue.enqueue(response);
            console.log('Queuing');
        }else{
            console.log('Queue is full! Enqueuing buffer');
            buffer.enqueue(response);
        }
}    

function executeQueue(response, levels){
    levels.forEach(element => {

        if(element === 0){
        queuer(queueL1, queueL1_Buffer, element, response);
        }else{
        queuer(uxQueue, uxQueue_Buffer, element, response);
        };
        
        
    });

}

function fetchData(){
        require("got").get("https://data.messari.io/api/v2/assets?sort")
        .json()
        .then(response => {
             const size = Buffer.byteLength(JSON.stringify(response));
             const kiloBytes = size / 1024;
             const megaBytes = kiloBytes / 1024;
             console.log('Mega bytes received', megaBytes);
    }).then(response => {
        current_response = response;

    }).then(response => {
        const levels = [0,1];
        executeQueue(response, levels);
    });
};
function getClientQueue(){
    return uxQueue;
};

function getCurrentTime(){
    const time = current_response['status'];
    return time['timestamp'];
};

function getSymbol(){
    const data = current_response['data'];
    return data['symbol'];
};
setInterval(fetchData, TIME);
var instance;
 return { // public interface
    getInstance : function(){
        if(instance == null){
            instance = new DataService();
            instance.constructor = null;
        };
        return instance;
    }
  };
})();

main_app/controllers/AnalyticsController.js

const service = require('../services/DataService')
 var dataService = service.getInstance();


var path = require('path');
//display home page
exports.home_page = function(req, res){
    res.sendFile(reqPath+'/views/home.html');
};

exports.get_mc_index = function(req, res){
    res.send('NOT IMPLEMENTED. Market caps ');
};

exports.get_mc_index = function(req, res){
    res.send('NOT IMPLEMENTED. Market cap index');
};

exports.get_ji_index = function(req, res){
    res.send('NOT IMPLEMENTED. J index');
};

exports.get_vi_index = function(req, res){
    res.send('NOT IMPLEMENTED. V index');
};

exports.get_symbol = function(req, res){
    try {
        
        sym = dataService.getCurrentTime();
        res.send('Success ' + sym);
    } catch (error) {
        
        res.send('Failed ' + error);
    }
}

exports.fetch_data = function(req, res){
    try {
        time = test.getCurrentTime();
        res.send('Successful');
        console.log('current time stamp ', time );
    } catch (error) {
        res.send('Failed');
    }
};


// Go back 1 directory
let reqPath = path.join(__dirname, '../');

【问题讨论】:

    标签: javascript node.js express singleton node-modules


    【解决方案1】:

    我在 DataService 中没有看到 module.exports。 :) 所以你的“要求”什么都不返回;

    此外,每个必需的文件都是单例,因此您的单例策略可能是不必要的。

    例如,如果您在许多文件中需要 A.js,您仍然会得到 A 的代码只执行一次。

    试试这个:

    // A.js
    console.log('a loaded');
    module.exports = function() {};
    // B.js
    var a = require('a.js');
    console.log('b loaded');
    module.exports = function() {};
    // C.js
    var a = require('a.js');
    var b = require('b.js');
    console.log('c loaded');
    

    会显示

    a loaded
    b loaded
    c loaded
    

    【讨论】:

    • 我试图这样做,但我仍然遇到同样的问题,我得到一个错误:TypeError: service.getInstance is not a function
    猜你喜欢
    • 2018-12-12
    • 1970-01-01
    • 2019-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 2012-06-06
    • 1970-01-01
    相关资源
    最近更新 更多