簡體   English   中英

NodeJS未處理拒絕錯誤:發送后無法設置標頭

[英]NodeJS Unhandled rejection error: Can't set headers after they are sent

我最近參與了一個nodejs項目,當我嘗試在我的數據庫訪問和我的路由之間使用promises時遇到錯誤在http:// localhost:8080 /上請求響應時發送它們后無法設置標題 api /用戶 雖然我知道堆棧上的許多解決方案都沒有為我解決,所以這是我在router.js的路由代碼

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

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

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

    });

database.js的第一部分包括函數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);
                }
            });   
     });
}

任何幫助都會很棒,謝謝你提前!

編輯:我再次檢查我的代碼,我有一個中間件來檢查用戶是否有權訪問某個頁面,因為它是剩下的最后一個選項之一,我可以在這里更改它:

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

我有一個輔助文件,我添加了permitions:

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

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

        "admin": [

        ]
    },

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


    }
}

因為這回答了你的問題,我會對答案做出評論:

在我看來,你的中間件可以不止一次調用next()

你在中間件函數的末尾調用next() 因此,在此之前沒有達到返回的任何代碼路徑都將觸及next() 但是其他一些代碼路徑也有自己的next()調用。 這是一個雙重調用。 基本上,您的中間件沒有正確地考慮其異步操作,並且沒有唯一的邏輯路徑,只會導致每個請求只調用next()res.redirect()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM