2017-10-21 1 views
0

Ich versuche, meinen Code zu modularisieren und Funktionsaufrufe vom Express-Router zu einem externen Modul zu verwenden, das meine Steuerungslogik enthält. Wie gibt man die Variablen nach Bearbeitung der Anfrage an den Router zurück?Übergeben von Variablen zwischen Express Router und Controller-Logik

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

Antwort

1

sollten Sie Versprechen für asynchrone Verhalten verwenden müssen. gibt es ein paar Bibliotheken da draußen wie async JavaScript Promise, Bluebird

können Sie alle davon verwenden.

kann sagen, auf server.js Datei, die Sie so etwas wie diese

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

}); 

auf Middleware-Teil schreiben (kann Ihren Controller sagen)

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

Danke für die Antwort, die ich versucht haben, um es zur Arbeit zu bringen, aber ich bekomme einen Fehler. Eigenschaft 'then' von undefined kann nicht gelesen werden, auf AnfrageSomething(). Der Funktionsaufruf tritt jedoch auf. –

+0

requestSomething() Ist es API-Aufruf? –

+0

Ja, es ist ein API-Aufruf. –

0

In Ihrem Fall sein eine Asynchron-Funktion, werden Sie versprechen dafür verwenden. Promise ist ein Objekt, das von einer Sync- oder Async-Funktion zurückgegeben werden kann, die abhängig von der Bedingung das Erfolgs- und Fehlerergebnis der Funktion enthält. Überprüfen Sie this für weitere Informationen.

Wie in Ihrem Router:

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

Wenn ich verstehe Ihre Anforderung. Bitte lesen Sie mehr über Versprechen Anrufe in Javascript.

Verwandte Themen