使用导出函数

时间:2017-08-07 06:12:09

标签: javascript node.js ecmascript-5

我有以下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:无法读取未定义的属性“getTicker”       在/home/ubuntu/workspace/routes/ticker.js:20:9       在Layer.handle [as handle_request](/home/ubuntu/workspace/node_modules/express/lib/router/layer.js:95:5)       在下一个(/home/ubuntu/workspace/node_modules/express/lib/router/route.js:137:13)       在Route.dispatch(/home/ubuntu/workspace/node_modules/express/lib/router/route.js:112:3)       在Layer.handle [as handle_request](/home/ubuntu/workspace/node_modules/express/lib/router/layer.js:95:5)       at /home/ubuntu/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)       在下一个(/home/ubuntu/workspace/node_modules/express/lib/router/index.js:275:10)       在Function.handle(/home/ubuntu/workspace/node_modules/express/lib/router/index.js:174:3)       在路由器(/home/ubuntu/workspace/node_modules/express/lib/router/index.js:47:12)

为什么会出现此错误以及如何解决?

3 个答案:

答案 0 :(得分:1)

您没有创建实例,因此您无法访问原型上的方法。您实际上只是调用exch.js导出的构造函数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

但我总是更喜欢使用var webServiceProxy = new ReportExecutionServiceSoapClient("ReportExecutionServiceSoap") 总是作为构造函数的前一种方法。

答案 1 :(得分:0)

require("../exchanges/exch")()调用函数而不是创建新实例,使用new进行实例化以使用prototype。您获得undefined的原因是Exchange没有返回任何内容。您认为它是constructor,但您将其称为function

请改用代码:

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

答案 2 :(得分:0)

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

exports.exchange = Exchange;

现在在router.js中修改

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

var exchObject= new exch();

现在您可以使用 exchObject 对象来调用方法

相关问题