Everyauth не работает в экспресс 4

Я использую nodejs, express 4 и everyauth для аутентификации в социальных сетях. У меня проблема, когда я нажимаю Accept из Google и перенаправляю обратно на свой /, я получаю

_http_outgoing.js: 335

выбросить новую ошибку («Не удается установить заголовки после отправки.»);

Я также использую electrolyte в качестве DI, но не думаю, что это будет проблемой. Вот мой код

index.js

var express = require('express'),
    http = require('http'),
    bootable = require('bootable');

var app = bootable(express());

app.phase(bootable.initializers('etc/init', app));

app.phase(bootable.routes(__dirname + '/routes.js', app));

app.phase(function listen(done) {
    http.createServer(app).listen(process.env.PORT || 3000, function(err) {
        if (err) { return done(err); }

        var addr = this.address();
        console.log('server listening on http://' + addr.address + ':' + addr.port);
        done();
    });
});

module.exports = app;

routes.js

var IoC = require('electrolyte');

module.exports = function routes() {

    this.get('/', IoC.create('handlers/homepage'));
    this.get('/api/foursquare', IoC.create('handlers/api/foursquare')); 
    //this.get('/auth/google/callback', IoC.create('handlers/auth/google_auth_callback'));
}

обработчики / домашняя страница

exports = module.exports = function() {
    function render(req, res, next) {
        res.render('index');    
    };

    return [render];
};

google.js

var everyauth = require('everyauth'),
    GoogleUser = require('../../app/models/google_user'),
    mongoose = require('../../app/db/mongo');

require('dotenv').load();

module.exports = function() {

    everyauth.google
        .appId(process.env.GOOGLE_CLIENT_ID)
        .appSecret(process.env.GOOGLE_CLIENT_SECRET)
        .scope('https://www.googleapis.com/auth/plus.login') // What you want access to
        .handleAuthCallbackError( function (req, res) {
            // If a user denies your app, Google will redirect the user to
            // /auth/facebook/callback?error=access_denied
            // This configurable route handler defines how you want to respond to
            // that.
            // If you do not configure this, everyauth renders a default fallback
            // view notifying the user that their authentication failed and why.
        })
    .findOrCreateUser( function (session, accessToken, accessTokenExtra, googleUserMetadata) {
        console.log('come back from google');
        console.log(session);
        // find or create user logic goes here
        // Return a user or Promise that promises a user
        // Promises are created via
        //     var promise = this.Promise();
        /*
        var googleUser = new GoogleUser(mongoose);
        var johndoe = new googleUser({
            accessToken: 'accessToken',
            expires: new Date(),
            refreshToken: 'refreshToken',
            email: '[email protected]',
            createdAt: new Date()
        });

        var promise = this.Promise();
        promise.resolve(johndoe);

        return promise;
        */
    }).redirectPath('/');
};

mongo.js

var mongoose = require('mongoose')

require('dotenv').load();

var uristring = process.env.MONGOLAB_URI;
mongoose.connect(uristring, function (err, res) {
    if (err) { 
        console.log ('ERROR connecting to: ' + uristring + '. ' + err);
    } else {
        console.log ('Succeeded connected to: ' + uristring);
    }
});

exports = module.exports = mongoose 

person toy    schedule 25.07.2015    source источник
comment
добавьте код handleAuthCallbackError и findOrCreateUser. вы получите Can't set headers after they are sent. ошибку, если ответ будет отредактирован после вызова response.send.   -  person Vishnu    schedule 25.07.2015
comment
Значит, мне просто нужно удалить одну из них?   -  person toy    schedule 25.07.2015


Ответы (1)


Вы получите Can't set headers after they are sent., если ваш код будет таким

  if (err) {
    res.send(err);
  }
  else if(!user) {
    res.send(info);
  }
  res.send(user);

В приведенном выше коде, если user не определено, он отправляет info в качестве ответа и снова переходит к следующему оператору, то есть res.send(user);. Таким образом, он не может устанавливать заголовки для уже отправленного ответа.

Вы можете предотвратить это

if (err) {
    res.send(err);
  }
  else if(!user) {
    res.send(info);
  }
  else {
    res.send(user);
  }

or

if (err) {
    return res.send(err);
  }
  else if(!user) {
    return res.send(info);
  }

  return res.send(user);
person Vishnu    schedule 25.07.2015
comment
Вы можете лучше понять по этой ссылке stackoverflow.com / questions / 23165569 / res-send-how-to-exit-after - person Vishnu; 25.07.2015