簡體   English   中英

使用導出的函數時無法讀取未定義的屬性

[英]Cannot read property of undefined when using exported function

我有以下Express應用:

router.js

var express = require('express');
var router = express.Router();
var exch = require("../exchanges/exch")();

router.get('/', function(req, res, next) {

    exch .getTicker((tick) => {
        res.send('get ticker exch: ' + JSON.stringify(tick));
    });

});

module.exports = router;

exch.js

var Kraken = require('kraken-api');
var moment = require('moment');
var _ = require('lodash');

/**
...code
**/

var Exchange = function(config) {
  _.bindAll(this);

  if(_.isObject(config)) {
    this.key = config.key;
    this.secret = config.secret;
    this.currency = config.currency.toUpperCase()
    this.asset = config.asset.toUpperCase();
  }

  this.pair = addPrefix(this.asset) + addPrefix(this.currency);
  this.name = 'kraken';
  this.since = null;

  this.kraken = new Kraken(this.key, this.secret);
}

Exchange.prototype.getTicker = function(callback) {
  var set = function(err, data) {
    if(!err && _.isEmpty(data))
      err = 'no data';

    else if(!err && !_.isEmpty(data.error))
      err = data.error;

    if (err)
      return console.log('unable to get ticker' + JSON.stringify(err));

    var result = data.result[this.pair];
    var ticker = {
      ask: result.a[0],
      bid: result.b[0]
    };
    callback(err, ticker);
  };

  this.kraken.api('Ticker', {pair: this.pair}, _.bind(set, this));
};

}

module.exports = Exchange;

如您所見,我正在通過require("...")()包含對象。 但是,我仍然收到以下錯誤:

無法讀取未定義的屬性“ getTicker”

TypeError:無法在Layer.handle的/home/ubuntu/workspace/routes/ticker.js:20:9讀取未定義的屬性“ getTicker”(作為handle_request)(/ home / ubuntu / workspace / node_modules / express / lib / router /layer.js:95:5)在Route.dispatch(/home/ubuntu/workspace/node_modules/express/lib/router/route.js:137:13)下(/ home / ubuntu / workspace / node_modules / express /lib/router/route.js:112:3)位於/ home / ubuntu上的Layer.handle [作為handle_request](/home/ubuntu/workspace/node_modules/express/lib/router/layer.js:95:5) /workspace/node_modules/express/lib/router/index.js:281:22在Function.process_params(/home/ubuntu/workspace/node_modules/express/lib/router/index.js:335:12)在下一個(/在Function.handle(/home/ubuntu/workspace/node_modules/express/lib/router/index.js:174:3)上的home / ubuntu / workspace / node_modules / express / lib / router / index.js:275:10)在路由器上(/home/ubuntu/workspace/node_modules/express/lib/router/index.js:47:12)

為什么會發生此錯誤,我該如何解決?

您沒有創建實例,因此無法訪問原型上的方法。 您實際上只是在調用exch.js導出的構造函數Exchange 由於直接調用構造函數時,不返回任何內容(隱式為undefined ),因此會出現以下錯誤:

var exch = require("../exchanges/exch")(); //exch is undefined because Exchange as a function returns nothing

這不會設置原型,因為您還沒有構造對象,僅稱為函數。 而是使用new構造一個新的Exchange對象:

var Exchange = require("../exchanges/exch");
var exch = new Exchange();

這將創建一個新的Exchange對象,您可以在其中從原型中調用getTicker 注意:確保將config傳遞給構造函數!


如果沒有new ,則可以在Exchange進行檢查,以查看是否不帶new意外地調用了它,並返回一個新實例:

var Exchange = function(config) {
  if(!(this instanceof Exchange)) {
    return new Exchange(config);
  }
  //...
}

這樣做是即使您直接調用該函數也將返回一個新的Exchange實例。 現在您可以使用:

var exch = require("../exchanges/exch")();

但是我總是更喜歡使用將new 始終用於構造函數的前一種方法。

require("../exchanges/exch")()調用函數而不是創建新實例,請使用new實例化以便使用prototype undefined的原因是Exchange返回任何內容。 您假設它是一個constructor ,但您將其稱為function

使用代碼代替:

var exchModule = require("../exchanges/exch")
var exch=new exchModule()

在exch.js中更改代碼的最后一行

exports.exchange = Exchange;

現在在router.js中進行修改

var exch = require("../exchanges/exch").exchange;

var exchObject= new exch();

現在您可以使用exchObject對象來調用方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM