为了账号安全,请及时绑定邮箱和手机立即绑定

错误:无法在将标头发送到客户端后设置标头

错误:无法在将标头发送到客户端后设置标头

错误:无法在将标头发送到客户端后设置标头我是Node.js的新手,我遇到了一些问题。我使用的是Node.js 4.10和Express 2.4.3。当我尝试访问http://127.0.0.1:8888/auth/facebook时,我将被重定向到http://127.0.0.1:8888/auth/facebook_callback。然后我收到以下错误:Error: Can't render headers after they are sent to the client.     at ServerResponse.<anonymous> (http.js:573:11)     at ServerResponse._renderHeaders (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:64:25)     at ServerResponse.writeHead (http.js:813:20)     at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:28:15     at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:113:13     at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/strategyExecutor.js:45:39)var fbId= "XXX";var fbSecret= "XXXXXX";var fbCallbackAddress= "http://127.0.0.1:8888/auth/facebook_callback"var cookieSecret = "node";// enter a random hash for securityvar express= require('express');var auth = require('connect-auth')var app = express.createServer(); app.configure(function(){     app.use(express.bodyParser());     app.use(express.methodOverride());     app.use(express.cookieParser());     app.use(express.session({secret: cookieSecret}));     app.use(auth([         auth.Facebook({             appId : fbId,             appSecret: fbSecret,             callback: fbCallbackAddress,             scope: 'offline_access,email,user_about_me,user_activities,manage_pages,publish_stream',             failedUri: '/noauth'         })     ]));     app.use(app.router);});app.get('/auth/facebook', function(req, res) {   req.authenticate("facebook", function(error, authenticated) {     if (authenticated) {       res.redirect("/great");       console.log("ok cool.");       console.log(res['req']['session']);     }我可以知道我的代码有什么问题吗?
查看完整描述

3 回答

?
慕雪6442864

TA贡献1812条经验 获得超5个赞

resExpress中的对象是Node.js的http.ServerResponse子类(读取http.js源代码)。您可以随时拨打电话res.setHeader(name, value),直到您打电话为止res.writeHead(statusCode)。之后writeHead,标题被烘焙,您只能调用res.write(data),最后res.end(data)

错误“错误:发送后无法设置标头”。表示您已处于Body或Finished状态,但某些函数尝试设置标题或statusCode。当您看到此错误时,尝试查找在已经写入某些正文后尝试发送标头的任何内容。例如,查找意外调用两次的回调,或发送正文后发生的任何错误。

在你的情况下,你打电话res.redirect(),导致响应成为完成。然后你的代码抛出一个错误(res.reqnull)。并且由于错误发生在您的实际内function(req, res, next)(不在回调中),Connect能够捕获它,然后尝试发送500错误页面。但由于标题已经发送,Node.js setHeader抛出了你看到的错误。

Node.js / Express响应方法的完整列表以及何时必须调用它们:

回复必须在Head并保持在Head

  1. res.writeContinue()

  2. res.statusCode = 404

  3. res.setHeader(name, value)

  4. res.getHeader(name)

  5. res.removeHeader(name)

  6. res.header(key[, val]) (仅限快递)

  7. res.charset = 'utf-8' (仅限Express;仅影响特定于Express的方法)

  8. res.contentType(type) (仅限快递)

响应必须在Head并成为Body

  1. res.writeHead(statusCode, [reasonPhrase], [headers])

响应可以在头部/身体中,并保留在身体中

  1. res.write(chunk, encoding='utf8')

响应可以在头部/身体中完成并且完成

  1. res.end([data], [encoding])

响应可以在头部/身体中,并保持其当前状态:

  1. res.addTrailers(headers)

响应必须在Head并且已完成

  1. return next([err]) (仅限连接/快速)

  2. 中间件中的任何异常function(req, res, next)(仅限Connect / Express)

  3. res.send(body|status[, headers|status[, status]]) (仅限快递)

  4. res.attachment(filename) (仅限快递)

  5. res.sendfile(path[, options[, callback]]) (仅限快递)

  6. res.json(obj[, headers|status[, status]]) (仅限快递)

  7. res.redirect(url[, status]) (仅限快递)

  8. res.cookie(name, val[, options]) (仅限快递)

  9. res.clearCookie(name[, options]) (仅限快递)

  10. res.render(view[, options[, fn]]) (仅限快递)

  11. res.partial(view[, options]) (仅限快递)


查看完整回答
反对 回复 2019-05-27
?
暮色呼如

TA贡献1853条经验 获得超9个赞

我有同样的问题并且意识到这是因为我在res.redirect没有return声明的情况下进行调用,所以next之后也立即调用了该函数:

auth.annonymousOnly = function(req, res, next) {
    if (req.user) res.redirect('/');
    next();};

应该是:

auth.annonymousOnly = function(req, res, next) {
    if (req.user) return res.redirect('/');
    next();};


查看完整回答
反对 回复 2019-05-27
  • 3 回答
  • 0 关注
  • 1643 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信