2017-10-22 16 views
2

죄송합니다. 이전에 분명히 답변되었습니다. 나는 특히 여기이 스레드에 대해 알고 :node.js 서버 응답의 비동기 함수 호출의 결과

How do I return the response from an asynchronous call?

하지만 솔직히 말해서, 난 아직 잃었어요. 필자는 단순히 함수를 비동기 적으로 호출하고 클라이언트에 대한 응답에서이 함수를 반환하는 방법을 이해하지 못합니다.

웹 페이지에 콘텐츠를 제공하는 다소 간단한 경로 (routes.js)가 있습니다. 사이트의 특정 요소는 rfid 태그의 목록입니다. 이 목록은 함수에서 채워지며, 물론 비동기라고 부르고 싶습니다.

내가 렌더링 엔진을 템플릿으로 (이전 옥라고도 함) 흙을 사용하고 있는데 내 tags.pug은 다음과 같습니다

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

마지막 페이지 참조 = BodyContent를을!? 이 요소는 태그 목록입니다. 당신이 볼 수 있듯이, 난,

// 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)) 
    }); 
}) 

자 : 아래

이 사이트가 반환되어야하는 app.get ('/ 태그') 내 routes.js에서 코드입니다 다른 모듈 (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 이전에 변수 (tagContent 또는 기타)를 채우고 해당 변수를 응답에 포함 시키려고하면 함수 호출의 결과가 표시되지 않습니다. 그러나 console.log에서 실행중인 함수와 생성 된 태그 목록을 볼 수 있습니다.

제발 누군가 제발 제발 제발, 내 routes.js 내에서 모듈 tagController에서 내 함수 getTagList를 호출하는 방법을 말해 줄 수 있도록 콘텐츠가 표시됩니다 ???

+1

비동기 호출에 대해 알아야 할 사항 중 하나는 결코 '반환'입니다. 호출자가 지정한'콜백 함수 '를 호출합니다. 아래 답변은 그 실례입니다. – Shaharyar

답변

1

기독교

종류에 관해서는, 그래서 문제는 getTagList 당신이 그것 ... 올바른 그렇게 처리 할 수 ​​있음을 보장 할 수 없습니다 반환하려는 상관없이 비동기 작업을 실행되지 것입니다 이 호출은 getTagList에 콜백 함수를 전달합니다.이 콜백 함수는 비동기 콜백 함수 내에서 호출됩니다. fs.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의 콜백 함수 내부에있는 요청을 보낼 수있는 경로를 업데이트

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 
      }); 
     } 
    }); 
}) 

또한 노드에서 콜백 함수가 어떻게 구현되는지 알 수 있습니다. 첫 번째 인수에는 오류를 전달하고 두 번째 인수에는 결과를 전달합니다. 더 나은 유지 보수가 가능한 코드를 갖습니다.

마지막으로 동일한 개념이 코드에 이미있는 fs.readdir에서 실제로 사용 된 것을 볼 수 있습니다. 콜백 함수를 사용하면 항목에 올바르게 액세스 할 수 있습니다.

+1

코드가 정확하지만 OP가 실제로 잘못된 점을 이해할 수 있도록 솔루션을 설명해야합니다. – Shaharyar