2016-09-28 34 views
1

一個功能,我有一個由形式張貼到一個快速的路線,下面是一個截斷示例。最初的表單位於一個iframe中,所以在收到http://example.com/endpoint的響應之後,我會發送一個響應回到iframe,其鏈接將轉到「簽名」頁面,並以父框架爲目標。重定向客戶端,而現在執行與快遞

不幸的是,從http://example.com/endpoint響應可以採取很長,這會導致iframe的超時和從未得到答覆。我想要做的是立即將某種類型的響應發送回iframe,並將頁面重定向到某種「加載頁面」 - 當路由器等待來自http://example.com/endpoint的響應時,會顯示此信息。

我使用快遞服務包含iframe來用戶對現在的網頁 - 所有的意見在服務器端控制。

我不知道是否有任何資源有人可以指向我往,什麼輕推我在正確的方向。

router.post('/api/orders', function(req, res) { 

    var order = { 
     'model': req.body.model, 
     'options': optionsArray 
    } 

    request.post({ 
     url: 'http://example.com/endpoint, 
     body: order, 
     json: true 
    }, function(err, response, body) { 
     if (!error && response.statusCode === 200) { 
      if (!body.isCustom) { 
       hellosign.embedded.getSignUrl(body.signatureId) 
        .then(function(response) { 
         var signatureUrl = response.embedded.sign_url; 
         var resSignatureUrl = encodeURIComponent(signatureUrl); 
         res.send('<a href="http://' + req.headers.host + '/order/sign/' + body.orderNumber + '?url=' + resSignatureUrl + '" target="_parent">Click to sign</a>'); 
        }) 
        .catch(function(err) { 
         console.log(err); 
        }) 
      } else { 
       res.send('You selected custom options.'); 
      } 
     } 
     if (error || response.statusCode === 403) { 
      res.json({ 
       message: 'something went wrong with your order', 
       errorCode: response.statusCode, 
       errorMessage: body.message 
      }); 
     } 
    }); 
}); 
+0

聽起來像是你需要的用戶可以查詢或調查作業的狀態,並在完成時重定向到結果的作業隊列。像https://github.com/Automattic/kue – Matt

回答

0

我會把hellosign /任何長時間運行的API調用放在它自己的模塊中。單獨測試以確保其工作。

那麼你的iframe或什麼(你真的需要一個iframe?)發送這僅僅是一個'啓動順序的要求從hellosign模塊獲取的訂單ID請求。然後使用setInterval或其他東西來檢查一個新的端點,它是'orderstatus'端點。

你orderstatus端點訪問您的新hellosign模塊,檢查訂單的狀態。

所以它可能是這樣的:

post('/start', function(req,res) { 
    var id = hellosign.startorder(req.body.model); 
    res.send(id); 
}); 

get('/status', function(req,res) { 
    res.send(hellosign.checkstatus(req.body.id)); 
} 


// hellosign.js 

var status = {}; 
exports.startorder = function(model) { 
    var id = uuid.v4(); // some unique id; 
    status[id] = 'started'; 
    request.post(api, /* ... */).then(function(signurl) { status[id] = signurl }); 
    return id; 
} 

exports.checkstatus = function(id) { 
    return status[id]; 
} 
相關問題