使用nodejs和express做系统登录,先上代码:
1.login模块:
var user = require('../lib/user-model'); exports.login = function(request, response) { user.authenticate({ username: request.body.username, password: request.body.password, //认证通过 success: function(res) { if(res.access.token.id) { // 将token保存到session,然后跳转到首页 request.session.token = res.access.token.id; response.redirect('home'); return response; } else { response.render('login', { errorMessage: "Server Internal Error, Try again later"}); } }, //认证失败,返回提示信息 error: function(err) { response.render('login', { locals: { errorMessage: err.content.error.message } }); return response; } }); }
2.认证模块:
var rest = require('restler'); function authenticate(options) { //认证服务url var url = 'http://200.21.0.33:5000/v2.0/tokens'; var postBody = { 'auth': { 'passwordCredentials': { 'username': options.username, 'password': options.password } } }; var data = JSON.stringify(postBody); var headers = {}; headers['Content-Type'] = 'application/json'; //发送认证请求 rest.request(url, { headers : headers, method : 'POST', data : data, multipart: false, followRedirects: false }).once('success', function(data, response) { //成功响应后,向login模块返回成功信息 var data = JSON.parse(data); options.success(data); }) .once('complete', function(result, response) { var statusCode = (response) ? response.statusCode : 'ECONNREFUSED'; if (result instanceof Error) { options.error(errorMessage(statusCode, JSON.parse(result))); } else if(!/^2\d{2}$/.test(statusCode) && statusCode != 302) { // 认证失败,返回失败信息 options.error(errorMessage( response.statusCode, JSON.parse(result))); } });以上代码实现的功能很简单,当用户名和密码都正确时通过认证跳转到主页,认证失败则给出提示信息。
现在认证通过部分没有问题,遇到问题的地方是在认证失败给出提示信息后,若填写了正确的用户名和密码再次登录,则会报错:
throw new Error('Can\'t set headers after they are sent.');
Error: Can't set headers after they are sent.
at ServerResponse.OutgoingMessage.setHeader (http.js:707:11)
at ServerResponse.res.setHeader (/home/yue/workspace/vertical/node_modules/express/node_modules/connect/lib/patch.js:59:22)
at ServerResponse.res.set.res.header (/home/yue/workspace/vertical/node_modules/express/lib/response.js:518:10)
at ServerResponse.res.location (/home/yue/workspace/vertical/node_modules/express/lib/response.js:652:8)
at ServerResponse.res.redirect (/home/yue/workspace/vertical/node_modules/express/lib/response.js:694:8)
at Object.user.authenticate.success (/home/yue/workspace/vertical/routes/session.js:52:26)
at EventEmitter.rest.request.once.once.statusCode (/home/yue/workspace/vertical/lib/test-user-model.js:145:17)
at EventEmitter.g (events.js:175:14)
at EventEmitter.emit (events.js:117:20)
at EventEmitter.mixin._fireSuccess (/home/yue/workspace/vertical/node_modules/restler/lib/restler.js:205:12)
请问有什么办法解决,感谢!!!
原来是使用的httpclient工具'restler'与nodejs版本的问题,改成request后就可以了
最好把errorMessage也贴出来。
那个错误是在你发送header头信息的时候已经有内容输出了,header头信息应该在内容输出前发送出去。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。