2013-05-19 2 views
1

Чтобы сделать это более понятным тому, чего я пытаюсь достичь.Доступ к другой функции module.exports из того же файла node.js

У меня есть сервер, который включает в себя много модулей, а один из модулей используется для проверки, является ли роль пользователя администратором или нет.

Server.js в

var loginAPI = require('myModule')(argStringType), 
     express = require('express'); 

    var app = express(); 

Теперь, когда в myModule.js у меня есть несколько функций, которые уже были реализованы и просто хотел бы добавить еще один, но эта функция действительно не нужно быть звонить из server.js вместо его будет звонить, как только человеку посетить URL, поэтому я хочу, чтобы добавить что-то вроде этого в myModule.js

в myModule.js

app.get("/post/:postid", function(req, res) { 
    var id = req.param('postid'); 
    return getContent(postid); 
}); 



// Module.exports 
module.exports = function (arg) { 

    return { 

    getContent: function (id) { }, 

    getHeader: function (id) { }; 
}; 

Так как вы можете видеть из вышеизложенного, у меня есть две функции, которые находятся в module.exports, и они отлично работали без проблем, кроме той, которая находится за пределами module.exports, что одна работа, если я не пытаюсь позвонить getContent, но это то, чего я пытаюсь достичь. Когда кто-то посещает сайт, введя URL в этом формате, app.get должен быть огнем и делать все, что было сделано для выполнения.

+0

Не могли бы вы просто экспортировать его? Я не вижу смысла в другом вопросе. 'return {exportName: exportName, [...]' и после запроса: 'loginAPI.exportName (arg)' –

+0

@ FabrícioMatté Дело в том, что я хочу, чтобы этот 'app.get' всегда был активным без вызова, поэтому один раз они «требуют», они будут использоваться сразу. – Ali

+0

Я вижу. Все еще не совсем уверен в том, чего вы пытаетесь достичь, но из вашего кода кажется, что вы хотите добавить метод к «глобальному» объекту. –

ответ

5

Убедитесь, что каждый модуль в Node.js имеет свой собственный объем. Так

ModuleA:

var test = "Test output string"; 
require('ModuleB'); 

ModuleB:

console.log(test); 

просто выход undefined.

С учетом сказанного, я думаю, что это стиль модуля вы ищете:

server.js:

var app = //instantiate express in whatever way you'd like 
var loginApi = require('loginModule.js')(app); 

loginModule.js:

module.exports = function (app) { 

    //setup get handler 
    app.get("/post/:postid", function(req, res) { 
    var id = req.param('postid'); 
    return getContent(postid); 
    }); 

    //other methods which are indended to be called more than once 
    //any of these functions can be called from the get handler 
    function getContent (id) { ... } 

    function getHeader (id) { ... } 

    //return a closure which exposes certain methods publicly 
    //to allow them to be called from the loginApi variable 
    return { getContent: getContent, getHeader: getHeader }; 
}; 

Очевидно, приспосабливайтесь к вашим фактическим потребностям. Существует множество способов сделать то же самое, но это подходит ближе всего к вашему оригинальному примеру. Надеюсь, это поможет.

+0

Это имеет больший смысл из вашего ответа, и я лучше понимаю его на вашем пути, но единственная проблема, с которой я столкнулся, состоит в том, что я не хочу изменять весь модуль, который я пытаюсь реализовать. Это проект с открытым исходным кодом, в который я вношу свой вклад, поэтому они хотят, чтобы я что-то добавлял в него, но не менял их коды. В любом случае, если это невозможно, я попытаюсь посмотреть, смогу ли я использовать их и реализовать, или, может быть, спросить их, подходят ли они для меня, чтобы они меняли свои коды. Благодаря! – Ali

+1

Если это проект с открытым исходным кодом, я бы определенно поставил ваш вопрос непосредственно сторонникам/сообществу и посмотрел, как они будут обрабатываться. У них вполне может быть парадигма, которая будет работать для вас. Удачи. –

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