2017-10-21 5 views
0

私はコードをモジュール化し、エクスプレスルータからコントローラロジックを含む外部モジュールへの関数呼び出しを利用しようとしています。要求を処理した後、どのように変数をルータに返すのでしょうか?あなたのケースの非同期機能でExpressルータとコントローラロジック間で変数を渡す

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

非同期動作にはpromiseを使用する必要があります。 ライブラリーがあります。async JavaScript Promise's、Bluebird

このようなライブラリを使用することができます。

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

は、私がしようとしている応答をありがとう(あなたのコントローラーを言うことができます)あなたはミドルウェア部にこの

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

ような何かを書くことをしたファイルあなたserver.jsに言うことができますそれを動作させるにはエラーが発生しています。 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でお読みください。

関連する問題