NodeJS从基于自定义模块的匿名函数中获取对象

我第一次尝试NodeJS和这个服务器是真棒,但我有一个小问题,我不明白我在做什么错:(

我有两个文件:server.js和rules.js

rules.js阅读rules.html必须将他的内容返回到像这样的对象:

{'title':'Title','msg':'<div id="test">[...]</div>'} 

Rules.js

 exports.getRule = function(data) { var fs = require('fs'); var rulesPath = __dirname + '/views/rules.html'; fs.readFile(rulesPath, {encoding:'utf-8'}, function(error, data) { if(!error){ var rules = {"title":"Règles du chat","msg":data}; } else { var rules = {"title":"Erreur lors de la récupèration des règles du chat","msg":"<div id=\"error\">Une ereur s'est produite lors de la récupération des données, veuillez rééssayer plus tard...<br />Si le problème persiste signalez le</div>"}; } return rules; }); } 

Server.js

 // Load custom Rules module var rules = require(__dirname + '/private/rules/rules.js'); // Perform actions when the client want open jQueryUI modal dialog socket.on('openBox', function(data) { if(data.id == 'rules'){ console.log(rules.getRule(data)); socket.emit('openBox',rules.getRule(data)); } }); 

 function(error, data) { if (!error) { var rules = { "title": "Règles du chat", "msg": data }; } else { var rules = { "title": "Erreur lors de la récupèration des règles du chat", "msg": "<div id=\"error\">Une ereur s'est produite lors de la récupération des données, veuillez rééssayer plus tard...<br />Si le problème persiste signalez le</div>" }; } return rules; } 

这段代码被称为回叫function。 当读取的数据可用时,这将由fs.readFile调用。 从callback函数返回时,实际上是返回到fs.readFile ,这很可能会忽略callback函数的返回值。 这就是为什么你的代码不工作。 你应该做的是从Server.js传递callback函数,像这样

 socket.on('openBox', function(data) { if (data.id == 'rules') { rules.getRule(data, function(error, data) { if (!error) { var rulesObj = { "title": "Règles du chat", "msg": data }; } else { var rulesObj = { "title": "Erreur lors de la récupèration des règles du chat", "msg": "<div id=\"error\">Une ereur s'est produite lors de la récupération des données, veuillez rééssayer plus tard...<br />Si le problème persiste signalez le</div>" }; } console.log(rulesObj); socket.emit('openBox', rulesObj); }); } }); 

并像这样改变Rules.js

 exports.getRule = function(data, callBackFunction) { var fs = require('fs'); var rulesPath = __dirname + '/views/rules.html'; fs.readFile(rulesPath, {encoding:'utf-8'}, callBackFunction); }