2016-04-15 7 views
1

私はexpress.jsを使ってサーバーを開発しています。このサーバーは、github apiにwebhooks内のユーザーのリポジトリを取得するよう要求します。問題は、この要求の戻り値:エラー504を解決するには:express.js(v 4.0.0)のゲートウェイタイムアウト?

problem with request: timed out 
[error] { [Error: 504: Gateway Timeout] 
[error] defaultMessage: 'Gateway Timeout', 
[error] message: '504: Gateway Timeout', 
[error] code: '504' } 

マイコード:

  • サービス:

    exports.getWebHooks =関数getWebHooks(githubtoken、arrRepos){

    var promise = new Hope.Promise(); 
    
    var arrReposDef = []; 
    
    var github = new GitHubApi({ 
        version: "3.0.0", 
        debug: true, 
        protocol: "https", 
        host: "api.github.com", // should be api.github.com for GitHub 
        timeout: 5000, 
        headers: { 
         "user-agent": "Meanstack" // GitHub is happy with a unique user agent 
        } 
    }); 
    
    
    github.authenticate({ 
        type: "oauth", 
        token: githubtoken.token 
    }); 
    
    
    async.each(arrRepos, 
    
        function(item, callback){ 
         // It runs well 
    
         github.repos.getHooks({ 
    
          user: githubtoken.username, 
          repo: item.name, 
    
          headers: { 
           "X-GitHub-OTP": "two-factor-code" 
          } 
    
         }, function(err, res) { 
          if (err) { // it runs wrong 2 times, this the error that I defined up. 
           console.log(err); 
           githuberror = true; 
    
          } 
    
          else{ // it runs well 2 times 
    
    
    
           if(!res.length){ 
    
            arrReposDef.push(item); 
    
    
           } 
    
           else{ 
            var enc = false; 
    
            for(var i = 0; i< res.length; i++){ 
             if(res[i].config !== undefined && res[i].config !== null){ 
              if(res[i].config.url !== undefined && res[i].config.url !== null){ 
    
    
    
               if(res[i].config.url !== config.githubcallback){ 
    
                enc = true; 
    
    
               } 
              } 
    
             } 
            } 
            if(enc) { 
    
    
             arrReposDef.push(item); 
    
    
            } 
    
    
           } 
    
    
    
          } 
          callback(); //required 
         }); 
        }, 
    
        // 3rd param is the function to call when everything's done 
        function(err){ 
    
         if(err){ 
          console.log('Error:' + err); 
          return promise.done(err,null); 
         } 
    
         // All tasks are done now 
         else{ 
    
          return promise.done(null,arrReposDef); 
    
    
         } 
        } 
    ); 
    
    return promise; 
    

    };

私はCMDのおかげで結果アプリケーションフローを知っている:

REQUEST: { host: 'api.github.com', 
    port: 443, 
    path: '/repos/1izpena/angularProject/hooks?access_token=secret', 
    method: 'get', 
    headers: 
    { host: 'api.github.com', 
    'content-length': '0', 
    'x-github-otp': 'two-factor-code', 
    'user-agent': 'Meanstack', 
    accept: 'application/vnd.github.v3+json' } } 
entro en webhooks, dentro del callback 
REQUEST: { host: 'api.github.com', 
    port: 443, 
    path: '/repos/1izpena/ionicProject/hooks?access_token=secret', 
    method: 'get', 
    headers: 
    { host: 'api.github.com', 
    'content-length': '0', 
    'x-github-otp': 'two-factor-code', 
    'user-agent': 'Meanstack', 
    accept: 'application/vnd.github.v3+json' } } 
entro en webhooks, dentro del callback 
REQUEST: { host: 'api.github.com', 
    port: 443, 
    path: '/repos/1izpena/ionicProjectDef/hooks?access_token=secret', 
    method: 'get', 
    headers: 
    { host: 'api.github.com', 
    'content-length': '0', 
    'x-github-otp': 'two-factor-code', 
    'user-agent': 'Meanstack', 
    accept: 'application/vnd.github.v3+json' } } 
entro en webhooks, dentro del callback 
REQUEST: { host: 'api.github.com', 
    port: 443, 
    path: '/repos/1izpena/RestAPI/hooks?access_token=secret', 
    method: 'get', 
    headers: 
    { host: 'api.github.com', 
    'content-length': '0', 
    'x-github-otp': 'two-factor-code', 
    'user-agent': 'Meanstack', 
    accept: 'application/vnd.github.v3+json' } } 
STATUS: 200 
HEADERS: {"server":"GitHub.com","date":"Fri, 15 Apr 2016 18:56:08 GMT","content-type":"application/json; charset=utf-8","content-length":"2","connection":"close","status":"200 OK"..."x-github-request-id":""} 
entro en webhooks, no hay errores 
entro en webhooks, en if 
STATUS: 200 
HEADERS: {"server":"GitHub.com","date":"Fri, 15 Apr 2016 18:56:08 GMT","content-type":"application/json; charset=utf-8","content-length":"2","connection":"close","status":"200 OK"...,"x-github-request-id":""} 
entro en webhooks, no hay errores 
entro en webhooks, en if 
problem with request: timed out 
[error] { [Error: 504: Gateway Timeout] 
[error] defaultMessage: 'Gateway Timeout', 
[error] message: '504: Gateway Timeout', 
[error] code: '504' } null 1izpena 
{ [Error: 504: Gateway Timeout] 
    defaultMessage: 'Gateway Timeout', 
    message: '504: Gateway Timeout', 
    code: '504' } 
problem with request: timed out 
[error] { [Error: 504: Gateway Timeout] 
[error] defaultMessage: 'Gateway Timeout', 
[error] message: '504: Gateway Timeout', 
[error] code: '504' } null 1izpena 
{ [Error: 504: Gateway Timeout] 
    defaultMessage: 'Gateway Timeout', 
    message: '504: Gateway Timeout', 
    code: '504' } 

任意のアイデア?どうもありがとう。

答えて

-2

問題は、APIが応答に時間がかかりすぎるということです。これはおそらく、外部APIを呼び出すことに起因するコードのバグが原因です。ここでいくつかのコードを共有して問題を見つけることができますか?タイムアウトミドルウェアを使用すると、Webリクエストを処理するためにアプリケーションがハングアップするケースが標準化されます。

ここでは、必要に応じてレスポンスを終了するWebリクエストハンドラを更新します。

exports.auth = function auth (request, response) { 
    var userid= request.params.userid; 
    var username = request.body.username; 
    var pass = request.body.pass; 

    var arrRepos = []; 
    var usertoken = ""; 

    if(userid !== undefined && userid !== null && 
      username !== undefined && username !== null){ 

     Auth(request, response).then(function(error, result) { 
      if (error) { 
       response.status(error.code).json({message: error.message}); 
       response.end(); 
       return; 
      } 

      if (userid !== result._id){ 
       response.status(401).json({message: 'Unauthorized. You are trying to access with a different userid'}); 
       response.end(); 
       return; 
      } 

      githubapiservice.getUserToken(userid, username).then(function (error,result){ 
       if(error){ 
        response.status(error.code).json({message: error.message}); 
        response.end(); 
        return; 
       } 

       var newResult = {}; 

       if(result == null){ 

        if(pass == undefined || pass == null || pass == ''){ 
         response.status(400).json({message: 'Bad Request. Missing required parameters'}); 
         response.end(); 
         return; 
        } 

        githubapiservice.createToken(userid,username,pass).then(function (error,result){ 
         if(error){ 
          var messageJSON= JSON.parse(error.message); 
          response.status(error.code).json({message: messageJSON.message}); 
          response.end(); 
          return; 
         } 

         if(result == null){ 
          response.json({message: "No se ha conseguido el token, intentelo de nuevo más tarde"}); 
          response.end(); 
          return; 
         } 

         usertoken = result; 

         githubapiservice.saveUserToken(userid, username, result).then(function (error,result){ 
          if(error){ 
           response.status(error.code).json({message: error.message}); 
           response.end(); 
           return; 
          } 

          if(result !== null){ 

           newResult.githubtoken = result; 

           githubapiservice.getRepositories(result).then(function (error,result){ 

            if(error){ 
             if(error.code == '504'){ 
              response.status(error.code).json({message: "Gateway Timeout"}); 
              response.end(); 
             } 
             else{ 
              var messageJSON= JSON.parse(error.message); 
              response.status(error.code).json({message: messageJSON.message}); 
              response.end(); 
             } 

             return; 
            } 

            if (result === undefined || result === null || result.length === 0){ 
             newResult.arrRepos = arrRepos; 
             response.json(newResult); 
             response.end(); 
             return; 
            } 

            newResult.arrRepos = result; 

            githubapiservice.getWebHooks(newResult.githubtoken, result).then(function (error,result) { 
             if (error) { 
              var messageJSON = JSON.parse(error.message); 
              response.status(error.code).json({message: messageJSON.message}); 
             } 
             else { 
              newResult.arrRepos = result; 
              response.json(newResult); 
             } 

             response.end(); 
            }); 
           }); 

           return; 
          } 

          response.status(422).json({message: "Validation Failed"}); 
          response.end(); 
         }); 

        }); /* end create token */ 
       } else { 
        newResult.githubtoken = result; 

        githubapiservice.getRepositories(newResult.githubtoken).then(function (error, result) { 

         if(error){ 
          var messageJSON= JSON.parse(error.message); 
          response.status(error.code).json({message: messageJSON.message}); 
          response.end(); 
          return; 
         } 

         if (result === undefined || result === null || result.length === 0){ 
          newResult.arrRepos = arrRepos; 
          response.json(newResult); 
          response.end(); 
          return; 
         } 

         githubapiservice.getWebHooks(newResult.githubtoken, result).then(function (error,result) { 
          if (error) { 


           var messageJSON = JSON.parse(error.message); 
           response.status(error.code).json({message: messageJSON.message}); 
           response.end(); 
           return; 
          } 


          newResult.arrRepos = result; 

          response.json(newResult); 
          response.end(); 

         }); 
        }); 
       } 
      }); /* end getUserToken */ 

     }); 
    } else { 
     response.status(400).json({message: 'Bad Request. Missing required parameters'}); 
     response.end(); 
    } 
}; 
+0

[OK]を、コードはかなり長いですが、今私は答えに追加します。 –

+0

2つのサービスはクリアされていますが、Webハンドラの読み込みに問題があります。あなたのWebハンドラでは、処理を完了するたびに(4xxステータスを設定するたびに)応答を終了し、エラーを回避するために関数から戻るように勧めました。 – yeiniel

+0

はい、私はエラーが発生したときにそれを送信します。コントローラーコードを分かりやすくするために切り捨てます。 –

関連する問題