2015-08-27 3 views
0

У меня есть этот маленький кусочек кода:Node JS и пользовательский модуль с экспресс-JS

'use strict'; 

module.exports = MainCtrl; 

function MainCtrl() { 
    this.defaultUrl = 'http://foo/'; 
} 

MainCtrl.prototype.getPoi = function getPoi() { 
    request('http://foo/',function(error,response,body) { 
    console.log(body); 
    }); 
}; 

и на моем файле маршрута я требую, как это:

var express = require('express'); 
var request = require('request'); 
var main_lib = require('../lib/main_ctrl.js'); 

var router = express.Router(); 


/* GET home page. */ 
router.get('/', function(req, res, next) { 

    res.render('index', { title: 'Express' }); 
}); 

router.get('/newroute', function(req,res) { 
    //var mainCtrl = new main_lib.MainCtrl(); 
    main_lib.getPoi(); 


    res.render('newroute', { title: 'New Route' }); 
}) 

module.exports = router; 

Как вы видите, очень просто, я на первых шагах с ExpressJS и NodeJS, но я не знаю, почему я получил эту ошибку:

TypeError: функция объекта MainCtrl() {this.defaultUrl = 'http://foo/ '; } Не имеет метод «getPoi»

Я взглянуть на определение модуля просмотра на экспресс-Lib и так же, как:

module.exports = View; 

function View(name, options) { .. } 
View.prototype.lookup = function lookup(name) { .. } 

Но я не могу понять, что я делаю неправильно.

+0

@Manwal Он имеет то, что это не ошибка здесь. Чтобы использовать ваш прототип, вам нужно создать экземпляр своего контроллера с помощью ключевого слова 'new'. –

ответ

1

Вы получаете ошибку при вызове функции MainCtrl вам нужно создать объект этого класса.

Используйте следующий код

'use strict'; 

function MainCtrl() { 
    this.defaultUrl = 'http://foo/'; 
} 

MainCtrl.prototype.getPoi = function getPoi() { 
    request('http://foo/',function(error,response,body) { 
    console.log(body); 
    }); 
}; 
//added function for getting instance 
module.exports.getInstance = function() { 
    return new MainCtrl(); 
}; 

При добавлении контроллера в использовании маршрутизатора это:

var main_lib = require('../lib/main_ctrl.js').getInstance(); 

Теперь main_lib является объектом вашего контроллера. Таким образом, вы можете назвать как:

main_lib.getPoi(); 

Если вы хотите использовать как View модуль вручную, вы должны создать объект для этого. как

'use strict'; 

module.exports = MainCtrl; 

function MainCtrl() { 
    this.defaultUrl = 'http://foo/'; 
} 

MainCtrl.prototype.getPoi = function getPoi() { 
    request('http://foo/',function(error,response,body) { 
    console.log(body); 
    }); 
}; 

В файле маршрута:

var main_lib = require('../lib/main_ctrl.js'); 

var main_lib_object = new main_lib();//take a look here 
main_lib_object.getPoi(parameter); 
+0

Большое спасибо, как и эта работа. Но почему в node_modules/express/lib/view.js объявляется по-другому? В чем разница между классом View и моим? – Rex

+0

Обновленный ответ проверить. – Manwal

Смежные вопросы