Error: Can't set headers after they are sent , happen only after refreshing a page
Error: Can't set headers after they are sent , happen only after refreshing a page
每次我在路由 'localhost:8080/' 刷新 html 页面或登录用户时,我都会收到此 错误:无法设置 headers sent. 据我所知,这个问题的发生是由于回调被意外调用了两次。该应用程序不会崩溃或发生任何事情,它只是在控制台上不断记录相同的错误。
这是代码。
var User = require('../models/user');
var Story = require('../models/story');
var jwt = require('jsonwebtoken');
var config = require('../../config');
var superSecret = config.secret;
module.exports = function(app, express) {
// creating our first router
var apiRouter = express.Router();
// signup a user
apiRouter.post('/signup', function(req, res) {
var user = new User({
name: req.body.name,
username: req.body.username,
password: req.body.password
});
user.save(function(err) {
if(err) res.send(err);
res.json({ message: 'User has been created!' });
});
});
apiRouter.get('/users', function(req, res) {
User.find({}, function(err, users) {
if(err) res.send(err);
res.json(users);
});
});
// user login
apiRouter.post('/login', function(req, res) {
User.findOne({
username: req.body.username
}).select('name username password').exec(function(err, user) {
if(err) throw err;
if(!user) {
res.json({ message: "Wrong User" });
} else if(user) {
var validPassword = user.comparePassword(req.body.password);
if(!validPassword) {
res.json({ message: "Invalid Password" });
} else {
var token = jwt.sign({
id: user._id,
name: user.name,
username: user.username
}, superSecret, {
expiresInMinute: 1440
});
// return all the sucess
res.json({
success: true,
message: "Successfully login and token created!" + token.name,
token: token
});
};
}
});
});
// write a middleware for login
// A middleware for login user only, once a user has logged in , he can enter other links below
apiRouter.use(function(req, res, next) {
// do logging
console.log("Somebody just came to our app!");
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
// check if token exist
if(token) {
jwt.verify(token, superSecret, function(err, decoded) {
if(err) {
res.status(403).send({ success: false, message: 'Failed to authenticate user' });
} else {
// if everything is good save request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
res.status(403).send({ success: false, message: 'No token provided' });
}
});
apiRouter.route('/')
.post(function(req, res) {
var story = new Story({
user: req.decoded.id,
content: req.body.content
});
story.save(function(err, stor) {
if(err) res.send(err)
console.log(stor);
res.json(stor);
});
})
.get(function(req, res) {
Story.find({ user: req.decoded.id }, function(err, story) {
if(err) res.send(err);
res.json(story);
});
});
apiRouter.get('/me', function(req, res) {
res.send(req.decoded.name);
});
apiRouter.route('/:user_id')
.get(function(req, res) {
User.findById(req.params.user_id, function(err, user) {
if(err) res.send(err);
res.json(user);
});
})
.put(function(req, res) {
User.findById(req.params.user_id, function(err, user) {
if(err) res.send(err);
if(req.body.name) {
user.name = req.body.name;
}
if(req.body.username) {
user.username = req.body.username;
}
if(req.body.password) {
user.password = req.body.password;
}
user.save(function(err) {
if(err) res.send(err);
res.json({ message: "User updated" });
});
});
});
return apiRouter;
}
发生错误时您发送了两次响应:
if (err) res.send(err);
res.json(foo);
将其替换为:
if (err) { res.send(err); return; }
res.json(foo);
每次我在路由 'localhost:8080/' 刷新 html 页面或登录用户时,我都会收到此 错误:无法设置 headers sent. 据我所知,这个问题的发生是由于回调被意外调用了两次。该应用程序不会崩溃或发生任何事情,它只是在控制台上不断记录相同的错误。
这是代码。
var User = require('../models/user');
var Story = require('../models/story');
var jwt = require('jsonwebtoken');
var config = require('../../config');
var superSecret = config.secret;
module.exports = function(app, express) {
// creating our first router
var apiRouter = express.Router();
// signup a user
apiRouter.post('/signup', function(req, res) {
var user = new User({
name: req.body.name,
username: req.body.username,
password: req.body.password
});
user.save(function(err) {
if(err) res.send(err);
res.json({ message: 'User has been created!' });
});
});
apiRouter.get('/users', function(req, res) {
User.find({}, function(err, users) {
if(err) res.send(err);
res.json(users);
});
});
// user login
apiRouter.post('/login', function(req, res) {
User.findOne({
username: req.body.username
}).select('name username password').exec(function(err, user) {
if(err) throw err;
if(!user) {
res.json({ message: "Wrong User" });
} else if(user) {
var validPassword = user.comparePassword(req.body.password);
if(!validPassword) {
res.json({ message: "Invalid Password" });
} else {
var token = jwt.sign({
id: user._id,
name: user.name,
username: user.username
}, superSecret, {
expiresInMinute: 1440
});
// return all the sucess
res.json({
success: true,
message: "Successfully login and token created!" + token.name,
token: token
});
};
}
});
});
// write a middleware for login
// A middleware for login user only, once a user has logged in , he can enter other links below
apiRouter.use(function(req, res, next) {
// do logging
console.log("Somebody just came to our app!");
var token = req.body.token || req.param('token') || req.headers['x-access-token'];
// check if token exist
if(token) {
jwt.verify(token, superSecret, function(err, decoded) {
if(err) {
res.status(403).send({ success: false, message: 'Failed to authenticate user' });
} else {
// if everything is good save request for use in other routes
req.decoded = decoded;
next();
}
});
} else {
res.status(403).send({ success: false, message: 'No token provided' });
}
});
apiRouter.route('/')
.post(function(req, res) {
var story = new Story({
user: req.decoded.id,
content: req.body.content
});
story.save(function(err, stor) {
if(err) res.send(err)
console.log(stor);
res.json(stor);
});
})
.get(function(req, res) {
Story.find({ user: req.decoded.id }, function(err, story) {
if(err) res.send(err);
res.json(story);
});
});
apiRouter.get('/me', function(req, res) {
res.send(req.decoded.name);
});
apiRouter.route('/:user_id')
.get(function(req, res) {
User.findById(req.params.user_id, function(err, user) {
if(err) res.send(err);
res.json(user);
});
})
.put(function(req, res) {
User.findById(req.params.user_id, function(err, user) {
if(err) res.send(err);
if(req.body.name) {
user.name = req.body.name;
}
if(req.body.username) {
user.username = req.body.username;
}
if(req.body.password) {
user.password = req.body.password;
}
user.save(function(err) {
if(err) res.send(err);
res.json({ message: "User updated" });
});
});
});
return apiRouter;
}
发生错误时您发送了两次响应:
if (err) res.send(err);
res.json(foo);
将其替换为:
if (err) { res.send(err); return; }
res.json(foo);