2016-04-05 15 views
0

Derzeit entwickle ich eine Express-App mit Middlewares. Erster Schritt, ich muss die Benutzer authentifizieren. In app.js Ich habe:Antwort kann nicht gesendet werden, nachdem Header gesendet wurden

app.post('/api/ecosystem/project/auth', 
    middleware.authenticate, 
    function(req,res){ 
    } 
); 

In der Middleware, muss ich den params durch den Anwender zugreifen, so dass ich den Zugriff auf body, das Setzen von Headern. In middleware/index.js:

function authenticate(req, res, next){ 
     var plainPassword = req.body.password, 
      userName = req.body.username; 

     models.connection.query(
       `SELECT * FROM TABLE_1 WHERE username = ?`, 
       [userName] ,function(err, query) { 
        var err = true; //for testing purposes 
        if (err) res.statusCode = 500; 

       console.log('continues'); 
       //... 

Das Problem kommt, wenn ich versuche, den Statuscode zu senden Zurück mehr. Da Header gesetzt sind, kann ich res.send(), res.status(), next() mit einem Fehlerparameter und so weiter nicht verwenden. Wenn ich das tue, habe ich einen Fehler über Headers have already been sent. Es gibt eine very amazing answer here about this.

So kann ich nur res.statusCode verwenden, aber dies gibt den Status nicht zurück und stoppt nicht den Fluss. Außerdem kann ich keine anderen Parameter als err.message in einer JSON-Datei senden.

Irgendwelche Ideen, wie man das löst?

Danke !!

Antwort

1

Sie können statusCode in err Objekt speichern und an next Funktion übergeben. Wenn Ihre Routen ordnungsgemäß definiert sind, sollten Sie eine Middleware für die Verarbeitung nicht bearbeiteter Fehler haben. Dieser Handler kann err.statusCode verwenden, um die richtige Antwort statusCode einzustellen.

function authenticate(req, res, next){ 
    var plainPassword = req.body.password; 
    var userName = req.body.username; 

    models.connection.query(
    `SELECT * FROM TABLE_1 WHERE username = ?`, 
    [userName], 
    function(err, query) { 
     if (err) { 
     err.statusCode = 500; 
     return next(err); 
     } 
    } 
); 
}); 

In Ihrem routes.js müssen Sie haben:

YOUR ROUTES 

app.use(function(err, req, res, next) { 
    res.status(err.statusCode).send(err); 
}); 
Verwandte Themen