2016-05-07 6 views
3

Ich bin kürzlich in einem Nodejs-Projekt eingebunden worden und beim Versuch, Versprechen zwischen meinen Datenbankzugriffe und mein Routing zu verwenden, habe ich den Fehler gefunden Kann Header nicht festlegen nachdem sie gesendet werden bei der Frage nach einer Antwort bei http://localhost:8080/api/user. Obwohl ich so für mich hier bewusst viele Lösungen auf Stapel keine ausgearbeitet bin, ist mein Routing-Code bei router.jsNodeJS Unbehandelte Ablehnung Fehler: Kann Header nicht festlegen, nachdem sie gesendet werden

server.get('/api/user/', function (req, res) { 

     database.getUser() 
      .then(function(data){ 
       res.send(data); 
      }, function(err){ 

       res.send(500,{error: err}); 
      }); 

    }); 

und dem ersten Teil von database.js einschließlich der Funktion getUser

(function() { 

'use strict'; 
var Promise = require('bluebird'), 
    mysql = require("mysql"), 
    bcrypt = require('bcryptjs'), 
    client; 

exports.connect = function(){ 
    return new Promise(function(resolve, reject) { 
     client = mysql.createPool({ 
       connectionLimit : 100, 
       waitForConnection: true, 
       host  : 'localhost', 
       user  : 'root', 
       password : 'root', 
       database : 'public', 
       debug : false 
      }); 
      if(!client){ 
       reject('Deu merda'); 
      } 
      else{ 
       resolve(); 
      } 
    }); 
} 


exports.getUser = function(){ 
    return new Promise(function (resolve, reject) { 
    var query = "SELECT name FROM public.users"; 
    query = mysql.format(query); 
    client.query(query,function (err, result) { 
       if (err) { 
        reject(err); 
       } else { 
        resolve(result); 
       } 
      }); 
    }); 
} 

Jede Hilfe wäre großartig, danke im Voraus!

EDIT: Ich habe meinen Code erneut überprüft und ich habe eine Middleware, um zu überprüfen, ob ein Benutzer die Berechtigung hat, auf eine bestimmte Seite zuzugreifen, da es eine der letzten verbleibenden Optionen ist, wo ich etwas ändern könnte:

(function() { 

    'use strict'; 

    var routes = require("./routes"), 
     cookie = require("./utils"); 

    module.exports = function(req, res, next) { 

     var i; 

     if (req.url.split('/')[1] == 'api') { 

      // START REGION: API permissions (all) 
      for (i = 0; i < routes.api.all.length; i++) { 
       if (routes.api.all[i].indexOf(req.url) > -1) { 
        break; 
       } 
      } 
      if (i != routes.api.all.length) { 
       next(); 
      } else { 

       // END REGION: API permissions (all) 

       // START REGION: API permissions (logged) 
       cookie.verifySession(req.cookies.session) 
        .then(function (userId) { 

         for (i = 0; i < routes.api.logged.length; i++) { 
          if (req.url.indexOf(routes.api.logged[i]) > -1) { 
           break; 
          } 
         } 

         if (i == routes.api.logged.length) { 
          return res.sendStatus(403); 
         } else { 
          next(); 
         } 

        }) 
        .catch(function (err) { 
         return res.sendStatus(403); 
        }); 

      } 

      // END REGION: API permissions (logged) 

     } else { 

      // START REGION: Views permissions (all) 

      cookie.verifySession(req.cookies.session) 
       .catch(function (err) { 
        if (res.statusCode == null) { 
         return res.redirect('/forbidden'); 
        } 
       }); 

      for (i = 0; i < routes.views.all.length; i++) { 
       if (routes.views.all[i].indexOf(req.url) > -1) { 
        break; 
       } 
      } 

      if (i != routes.views.all.length) { 
       next(); 
      } else { 

       // END REGION: Views permissions (all) 

       // START REGION: Views permissions (logged) 

       cookie.verifySession(req.cookies.session) 
        .then(function (userId) { 

         for (i = 0; i < routes.views.logged.length; i++) { 
          if (req.url.indexOf(routes.views.logged[i]) > -1) { 
           break; 
          } 
         } 

         if (i == routes.views.logged.length) { 
          if (res.statusCode == null) { 
           return res.redirect('/forbidden'); 
          } 
         } else { 
          next(); 
         } 

        }); 

      } 

      // END REGION: Views permissions (logged) 

     } 
     next(); 
} 
}()); 

ich habe eine Hilfsdatei, wo ich die permitions hinzufügen:

{ 
    "api":{ 
     "all": [ 
      "/api/authenticate", 
      "/api/user" 
     ], 

     "logged": [ 
      "/api/lessons" 
     ], 

     "admin": [ 

     ] 
    }, 

    "views":{ 
     "all": [ 
      "/", 
      "/user_management" 
     ], 
     "logged": [], 
     "admin": [], 
     "advanced": [] 


    } 
} 
+2

Irgendwo versuchen Sie, eine Kopfzeile zu ändern, nachdem Inhalt an den Browser gesendet wurde. Leider scheint es nicht im geposteten Code zu sein. – adeneo

+0

Irgendwelche Ideen, wo ich nach dem Fehler suchen sollte? Ich habe ein bisschen von allem versucht, um ehrlich zu sein, aber ich kann nicht die Falle finden, in die ich gefallen bin. –

+0

Es sieht für mich so aus, als könnte Ihre Middleware 'next()' mehr als einmal aufrufen. Vielleicht möchten Sie nach dem Aufruf von 'next()' zurückkehren, damit keiner dieser Pfade das letzte 'next()' am Ende Ihrer Funktion erreicht. – jfriend00

Antwort

5

ich werde meinen Kommentar in eine Antwort machen, da dies Ihre Frage beantwortet:

I t sieht für mich aus wie Ihre Middleware mehr als einmal next() anrufen kann.

Sie rufen next() am Ende der Middleware-Funktion. Also, jeder Code-Pfad, der vorher keine Rückkehr getroffen hat, trifft den next(). Aber einige andere Codepfade haben auch eigene Aufrufe an next(). Das ist ein Doppelanruf. Grundsätzlich berücksichtigt Ihre Middleware ihre asynchronen Vorgänge nicht ordnungsgemäß und verfügt nicht über eindeutige logische Pfade, die nur einmal pro Anforderung zum Aufruf von next() oder res.redirect() führen.

+0

Ich hatte ein ähnliches Problem: Ich überprüfte die Validierungsergebnisse von Express-Validator innerhalb einer then(), umleiten, wenn es Fehler gab, aber meine Erfolgsumleitung war außerhalb der then() und nicht Teil der Promise. So wurden beide ausgeführt und ich erhielt den Fehler "Kann Header nach dem Senden nicht setzen". Deine Antwort hat meinen Tag gemacht. – Larrydx

Verwandte Themen