Когда я раскомментирую одну строку кода, я получаю эту ошибку: _http_outgoing.js:359 throw new Error("Не удается установить заголовки после их отправки.");

Когда я раскомментирую эту строку: return done(null, false, { message: 'Incorrect username' }); в следующем коде Node.js запускается без ошибок, в противном случае Node.js выдает ошибку, упомянутую позже:

//we need to define a local Strategy to authenticate with username and password
passport.use(new LocalStrategy(
    function(username, password, done) { //start of custom code
        //from here starts our custom code (inside this function scope)
        //outside this scope is from passport API documentation
        //process.nextTick(function() {
        UserFind(username, function(err, user) {
                if (err) {
                    return done(err);
                } else if (!user || user.length == 0) {
                    //When I uncomment the following line of code, an error occurs, but when I comment out the following, no error is received:
                    //return done(null, false, { message: 'Incorrect username' });
                } else {
                    console.log('user._id:' + user._id);
                    console.log('typeof user: ' + typeof(user));
                    console.log('user.username: ' + user.username);
                    console.log('user.password: ' + user.password);
                    if (password !== user.password) {
                        return done(null, false, { message: 'Incorrect password' });
                    }
                    return done(null, user);
                }

            })
            //}) //process.nextTick
    } //end of custom code
));

Ошибка, полученная, когда я раскомментирую вышеупомянутую строку:

_http_outgoing.js: 359 throw new Error ("Не удается установить заголовки после их отправки."); ^

Ошибка: невозможно установить заголовки после их отправки. в ServerResponse.setHeader (_http_outgoing.js:359:11) в ServerResponse.header (/home/ict/Documents/hookahDB/serverjs/node_modules/express/lib/response.js:719:10) в ServerResponse.location /home/ict/Documents/hookahDB/serverjs/node_modules/express/lib/response.js:836:15) в ServerResponse.redirect (/home/ict/Documents/hookahDB/serverjs/node_modules/express/lib/response.js:874:18) allFailed (/home/ict/Documents/hookahDB/serverjs/node_modules/passport/lib/middleware/authenticate.js:132:20) при попытке (/home/ict/Documents/hookahDB/serverjs/node_modules/passport/lib/middleware/authenticate.js:167:28) в Strategy.strategy.fail (/home/ict/Documents/hookahDB/serverjs/node_modules/passport/lib/middleware/authenticate.js:284:9) в проверенном состоянии (/home/ict/Documents/hookahDB/serverjs/node_modules/passport-local/lib/strategy.js:82:30) в /home/ict/Documents/hookahDB/serverjs/index.js:158:28 в / home / икт / Документы /hookahDB/serverjs/index.js:144:16

Интересно, почему эта единственная строка является причиной ошибки и как я могу ее устранить. Благодарю.

РЕДАКТИРОВАТЬ

Функция обратного вызова показана ниже:

function UserFind(username, cb) {
    db.view('users/by_username', function(err, res) {
        if (err) {
            //db.view returned error
            return cb(err);
        }
        res.forEach(function(key, value, id) {
                //1st input=key|username, 2nd input=value|userDocument, 3rd input=id|_id
                //console.log('key: '+key+' row: '+row+' id: '+ id);
                if (username === key) {
                    //found the user
                    return cb(false, value);
                }
            })
            //couldn't find the user by forEach loop
        return cb(false, false);
    })
}

1 ответ

Решение

Это сообщение об ошибке вызвано ошибкой синхронизации при обработке асинхронного ответа, которая заставляет вас пытаться отправить данные ответа после того, как ответ уже был отправлен.

Обычно это происходит, когда люди рассматривают асинхронный ответ внутри экспресс-маршрута как синхронный ответ, и в итоге они отправляют данные дважды.

Вы должны добавить еще в своем заявлении

if (password !== user.password) {
   return done(null, false, { message: 'Incorrect password' });
} else {
    return done(null, user);
}

Обновить:

function UserFind(username, cb) {
    var userFound = false, userVal = "";
    db.view('users/by_username', function(err, res) {
        if (err) {
            //db.view returned error
            return cb(err);
        }
        res.forEach(function(key, value, id) {
                //1st input=key|username, 2nd input=value|userDocument, 3rd input=id|_id
                //console.log('key: '+key+' row: '+row+' id: '+ id);
                if (username === key) {
                    //found the user
                    userFound = true;
                    userVal = value;
                }
            });

       if (userFound) {
          return cb(false, userVal);
       } else {
         // User did not found
         return cb(false, false);
       }
    })
}
Другие вопросы по тегам