我使用nodejs、express 4和everyauth进行社交网络身份验证。我遇到了一些问题,我从Google点击Accept,然后重定向回我的/
_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: '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 发布于 2015-07-25 17:02:28
如果您的代码是这样的,您将得到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);https://stackoverflow.com/questions/31628302
复制相似问题