2017-01-23 3 views
3

Ich verwende Versprechen in Express-Middleware. Ich möchte die async/await-Methoden verwenden.Wie kann ich das Standardverhalten für abgelehnte Versprechen für alle meine Express-Middlewares festlegen?

app.get('/data1',async function(req,res) { 
    data = await getData1(); // This line throw an error, 
    res.send(data) 
}) 
app.get('/data2',async function(req,res) { 
    data = await getData2(); // This line throw an error 
    res.send(data) 
}) 

Dies lässt den Browser für immer warten. Auf dem Server sehe ich

(node:251960) UnhandledPromiseRejectionWarning: Unhandled promise rejection 

Nun, es zu beheben für eine Middleware ich tue:

app.get('/data1',async function (req,res){ 
    return (async function(){ 
     data = await getData1() 
    })().catch(() => { 
     res.send("You have an error") 
    } 
}) 
app.get('/data2',async function (req,res){ 
    return (async function(){ 
     data = await getData2() 
    })().catch(() => { 
     res.send("You have an error") 
    } 
}) 

ich diese repetion nicht mögen. Wie kann ich einen Standardfehler einstellen? Ich habe zum Beispiel versucht:

app.use(function(error,req,res,next)){ 
    res.send('You have an error') 
} 

Aber es hat nicht funktioniert.

Mit anderen Worten: Wie Standardfunktion festgelegt wird, wenn Express-Middlewares eine zurückgewiesene Versprechen zurückgeben?

Antwort

1

Nun fand ich eine Art und Weise, wie es zu tun, ich bin immer noch die Frage, um weitere Anregungen offen halten

app.get("/data1", 
    wrap_middleware(async (req, res) => { 
     data1=await getData1() 
     res.send(data1) 
    }) 
} 
app.get("/data1", 
    wrap_middleware(async (req, res) => { 
     data2=await getData2() 
    }) 
} 

function wrap_middleware(func) { 
    return async (req, res, next) => { 
     func(req, res, next).catch(err => { 
      console.log(err.message); 
      res.send("Error"); 
     }); 
    }; 
} 
+0

Dies ist genau das, was Sie tun sollten, ja. Sie können jedoch 'Next' mit dem Fehler aufrufen, um die Express-Fehlerbehandlung zu verwenden. – Bergi

0

Ich verstehe nicht, die Verwendung von den gleichen Fehler für andere Funktion zu senden, aber ich denke, die Handhabung Fehlercode könnte besser lesbar Art und Weise schreiben in (nur den Fehler fangen und mit ihnen zu tun, was Sie auf die gleiche Weise möchten Sie Fehler in jeder Route Middleware fangen):

function getData1(){ 
    return new Promise((resolve,reject) => { 
     setTimeout(() =>{ 
      reject(new Error('error has occur!')); 
     },2000); 
    }); 
} 

router.get('/data1', async (req,res, next) => { 
    try{ 
     const data = await getData1(); 
     res.send(data); 
    } 
    catch(ex){ 
     res.send(ex.message); 
     // next(ex); => sending it to express to handle it 
    } 
}); 

Wenn Sie einen globalen Fehler wollen Handhabung dann Es unterscheidet sich nicht von irgendeinem Code, den Sie global erfassen möchten - Sie können eine Funktion, die als Parameter, die Antwort-Objekt und die Async-Code und allgemeine Fang für jeden asynchronen Aufruf setzen kommt von Middleware (die Antwortobjekt hat)

Verwandte Themen