【问题标题】:Everyauth is not working in express 4Everyauth 在 Express 4 中不起作用
【发布时间】:2015-10-16 04:12:28
【问题描述】:

我正在使用 nodejs、express 4 和everyauth 进行社交网络身份验证。我在点击 Google 的Accept 并重定向回我的/ 时遇到了一些问题,我得到了

_http_outgoing.js:335

throw new Error('Can\'t set headers after they are sent.');

我也使用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: 'john@doe.com',
            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 

【问题讨论】:

  • 添加handleAuthCallbackError和findOrCreateUser的代码。如果在调用 response.send 后编辑响应,您将收到 Can't set headers after they are sent. 错误。
  • 所以我只需要删除其中一个?

标签: javascript node.js mongodb express everyauth


【解决方案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);
  }

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

  return res.send(user);

【讨论】:

猜你喜欢
  • 2013-01-20
  • 2012-05-10
  • 2014-10-24
  • 2016-10-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-25
  • 2019-06-27
  • 2018-01-31
相关资源
最近更新 更多