node.js是服务器响应中asynchronous函数调用的结果

对不起,这个肯定已经回答了。 我特别在这里知道这个线程:

如何返回来自asynchronous调用的响应?

但说实话,我还是输了。 我只是不明白如何asynchronous调用一个函数,并且包含这个函数返回给客户端的响应。

我有一个相当简单的路由(在routes.js中),它将向网页提供内容。 该网站的特定元素是rfid标签列表。 这个列表是从一个函数中填充的,当然,我希望并且必须调用asynchron。

我使用帕格(以前称为玉)作为模板渲染引擎和我的tags.pug看起来像这样:

extends index.pug block content h2!= subheadline p!= messagetext p!= bodyContent 

看到最后的p!= bodyContent? 这个元素应该是标签列表。

以下是我的routes.js中带有app.get('/ tags')的代码片段,在该代码片段中将返回该站点:

 // get the listing of all stored rfid tags app.get("/tags", function(req, res) { res.render('tags', { title: 'RFID Tag Startseite', headline: 'RFID Tag Startseite', subheadline: 'Verfügbare Tags', messagetext: 'Bitte ein RFID Tag auswählen, um mehr Daten angezeigt zu bekommen', bodyContent: tagController.getTagList(app, function(tagController)) }); }) 

现在,正如你所看到的,我试图从不同的模块(tagController)调用位置bodyContent的函数(getTagList),这将提供标签列表。

以下你可以看到我的getTagList()函数的代码:

 var getTagList = function(app, result){ // get global app variables var DEBUG = app.get('DEBUG'); var svrAddr = app.get('svrAddr'); var rfidTagDir = app.get('rfidTagDir'); var responseContent = ''; fs.readdir(rfidTagDir, function(err, items) { responseContent = "{\'response\': \'info\', \'message\': \'list of all stored rfid tags\', \'tags\': [" for (i in items) { var tag = items[i].toString().substring(0,items[i].indexOf('.')); responseContent += "{\'tag\': \'" + tag + "\', \'endpoint\': \'"+svrAddr+"/tags/tag/" + tag + "\', \'file\': \'"+items[i]+"\'}" if (i<items.length-1) responseContent += ","; } responseContent += "]}" if (DEBUG) console.log(responseContent); result = responseContent; return result; )}; 

我的问题是,这是行不通的。 上面的代码给出了错误:

  SyntaxError: Unexpected token ) 

对于两者中的最后一个)。 如果我尝试在res.send之前填充一个variables(比如tagContent或其他),并将该variables包含到响应中,我简直看不到函数调用的结果。 但是在console.log中,我可以看到正在执行的函数和生成的标签列表。

请有人请,请告诉我,如何从我的routes.js内部模块tagController调用我的函数getTagList,以便内容显示?

亲切的问候,

基督教

所以问题是, getTagList将执行asynchronous操作,无论你试图返回它不能保证它的正确…所以要能够处理这个你传递一个callback函数getTagList将被调用的callback函数的asynchronousfs.readdir这是你100%确定你有正确的结果的预期。

所以下面是更新的getTagList函数

 var getTagList = function(app, callback) { // get global app variables var DEBUG = app.get('DEBUG'); var svrAddr = app.get('svrAddr'); var rfidTagDir = app.get('rfidTagDir'); var responseContent = ''; fs.readdir(rfidTagDir, function(err, items) { if (err) { callback(err); } else { responseContent = "{\'response\': \'info\', \'message\': \'list of all stored rfid tags\', \'tags\': [" for (i in items) { var tag = items[i].toString().substring(0, items[i].indexOf('.')); responseContent += "{\'tag\': \'" + tag + "\', \'endpoint\': \'" + svrAddr + "/tags/tag/" + tag + "\', \'file\': \'" + items[i] + "\'}" if (i < items.length - 1) responseContent += ","; } responseContent += "]}" if (DEBUG) { console.log(responseContent); } //Here we are 100% sure we have the correct expected result so we call the callback function with correct data `responseContent` callback(null, responseContent); } ) }; } 

此外,只有在getTagList的callback函数中有数据可用时,才更新路由以发送请求,请检查下面的代码

 app.get("/tags", function(req, res) { tagController.getTagList(app, function(err, result) { if (err) { console.log(err); //Handle error response } else { res.render('tags', { title: 'RFID Tag Startseite', headline: 'RFID Tag Startseite', subheadline: 'Verf&uuml;gbare Tags', messagetext: 'Bitte ein RFID Tag ausw&auml;hlen, um mehr Daten angezeigt zu bekommen', bodyContent: result }); } }); }) 

您还可以注意到callback函数是如何在节点中实现的…我们将任何错误传递给第一个参数,并将结果传递给第二个参数..以获得更好的可维护代码。

最后你可以看到在你的代码中已经存在的fs.readdir中实际使用的相同的概念,你会看到你正在使用callback函数来正确地访问项目。