2017-10-21 99 views
0

我想模塊化我的代碼,並利用從快速路由器到包含我的控制器邏輯的外部模塊的函數調用。在處理請求後,如何將路由變量傳遞迴路由器?快遞路由器和控制器邏輯之間傳遞變量

const express = require('express') ; 
 
const router = express.Router(); 
 
const bodyParser = require('body-parser') 
 

 
const requestSomething = require('./controller/abc.js'); 
 
    
 

 

 
router.post('/', function (req,res, next){ 
 
    requestSomething() <----// Need Variable from this 
 
    next() 
 
    },function(req,res,next){ 
 
     sendOrder(X) <--------//So I can use it further along in chain 
 
    } 
 
); 
 

 
module.exports = router;

//Controller logic, how to send body back to router?? 
 

 
const requestSomething = (req,res,next)=>{ 
 
    let options = { .... }; 
 
    requestSomething(options, function (error, response, body) { 
 
     if (error) throw new Error(error); 
 
     let x = JSON.parse(body); <--- How do I pass this back to router? 
 
    }) 
 
    } 
 
}

回答

1

您應該使用承諾異步行爲。 有幾個圖書館像async JavaScript Promise的,Bluebird

你可以使用任何這個。

可以說你的server.js文件,你必須寫這樣的事情

router.post('/', function (req,res, next){ 
    requestSomething().then((x)=>{ 
    return x; 
    }).then((x)=>{ 
    sendOrder(X) 
    }) <----// Need Variable from this 

}); 

中間件部分(可以說你的控制器)

return new Promise(function(resolve, reject) { 
    let options = { }; 
requestSomething(options, function (error, response, body) { //API Call 
    if (error) { 
    return reject(error); 
    } 
    let x = JSON.parse(body); //<--- How do I pass this back to router? 
    return resolve(x); 
}) 
}) 
+0

謝謝你,因爲我一直在嘗試響應讓它工作,但我得到一個錯誤。無法讀取未定義的屬性'then',請requestSomething()。then。函數調用確實發生。 –

+0

requestSomething()是API調用嗎? –

+0

是的,它是一個API調用。 –

0

在你的情況下,它的異步功能,你將不得不使用承諾爲。 Promise是一個可以通過同步或異步函數返回的對象,它包含函數的成功和失敗結果,具體取決於條件。請查看this瞭解更多信息。

就像在你的路由器:

router.post('/', function (req,res, next){ 
     requestSomething().then(function(x){ 
     next(); 
    }).catch(function(onError){ 
    }); //but the problem is, it will not wait for next. so you can use in then part 
//  next() 
     },function(req,res,next){ 
      sendOrder(X) <--------//So I can use it further along in chain 
     } 
    ); 

如果我明白你的要求。 請閱讀更多關於JavaScript中的承諾電話。