使用导出函数时无法读取未定义的 属性
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("...")()
包含了该对象。但是,我仍然收到以下错误:
Cannot read property 'getTicker' of undefined
TypeError: Cannot read property 'getTicker' of undefined
at /home/ubuntu/workspace/routes/ticker.js:20:9
at Layer.handle [as handle_request] (/home/ubuntu/workspace/node_modules/express/lib/router/layer.js:95:5)
at next (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:112:3)
at 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
at Function.process_params (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:335:12)
at next (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:275:10)
at Function.handle (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:174:3)
at router (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:47:12)
为什么会出现此错误,我该如何解决?
您不是在创建实例,因此您无法访问原型上的方法。您实际上只是在调用 exch.js
导出的构造函数 Exchange
。由于构造函数,当直接调用时,return什么都没有(隐式地 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
的情况下不小心调用了它,并 return 一个新实例:
var Exchange = function(config) {
if(!(this instanceof Exchange)) {
return new Exchange(config);
}
//...
}
这样做是 return Exchange
的新实例,即使您直接调用该函数也是如此。现在你可以使用:
var exch = require("../exchanges/exch")();
但我总是更喜欢使用new
always 构造函数的前一种方法。
require("../exchanges/exch")()
调用函数而不是创建新实例,使用new
实例化才能使用prototype
。你得到 undefined
的原因是 Exchange
returns 什么都没有。你假设它是 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 对象来调用方法
我有以下 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("...")()
包含了该对象。但是,我仍然收到以下错误:
Cannot read property 'getTicker' of undefined
TypeError: Cannot read property 'getTicker' of undefined at /home/ubuntu/workspace/routes/ticker.js:20:9 at Layer.handle [as handle_request] (/home/ubuntu/workspace/node_modules/express/lib/router/layer.js:95:5) at next (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:137:13) at Route.dispatch (/home/ubuntu/workspace/node_modules/express/lib/router/route.js:112:3) at 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 at Function.process_params (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:335:12) at next (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:275:10) at Function.handle (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:174:3) at router (/home/ubuntu/workspace/node_modules/express/lib/router/index.js:47:12)
为什么会出现此错误,我该如何解决?
您不是在创建实例,因此您无法访问原型上的方法。您实际上只是在调用 exch.js
导出的构造函数 Exchange
。由于构造函数,当直接调用时,return什么都没有(隐式地 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
的情况下不小心调用了它,并 return 一个新实例:
var Exchange = function(config) {
if(!(this instanceof Exchange)) {
return new Exchange(config);
}
//...
}
这样做是 return Exchange
的新实例,即使您直接调用该函数也是如此。现在你可以使用:
var exch = require("../exchanges/exch")();
但我总是更喜欢使用new
always 构造函数的前一种方法。
require("../exchanges/exch")()
调用函数而不是创建新实例,使用new
实例化才能使用prototype
。你得到 undefined
的原因是 Exchange
returns 什么都没有。你假设它是 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 对象来调用方法