猿问

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

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

我是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']);
    }

我可以知道我的代码有什么问题吗?


红糖糍粑
浏览 1644回答 3
3回答

慕雪6442864

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.req是null)。并且由于错误发生在您的实际内function(req, res, next)(不在回调中),Connect能够捕获它,然后尝试发送500错误页面。但由于标题已经发送,Node.js&nbsp;setHeader抛出了你看到的错误。Node.js / Express响应方法的完整列表以及何时必须调用它们:回复必须在Head并保持在Head:res.writeContinue()res.statusCode = 404res.setHeader(name, value)res.getHeader(name)res.removeHeader(name)res.header(key[, val])&nbsp;(仅限快递)res.charset = 'utf-8'&nbsp;(仅限Express;仅影响特定于Express的方法)res.contentType(type)&nbsp;(仅限快递)响应必须在Head并成为Body:res.writeHead(statusCode, [reasonPhrase], [headers])响应可以在头部/身体中,并保留在身体中:res.write(chunk, encoding='utf8')响应可以在头部/身体中完成并且完成:res.end([data], [encoding])响应可以在头部/身体中,并保持其当前状态:res.addTrailers(headers)响应必须在Head并且已完成:return next([err])&nbsp;(仅限连接/快速)中间件中的任何异常function(req, res, next)(仅限Connect / Express)res.send(body|status[, headers|status[, status]])&nbsp;(仅限快递)res.attachment(filename)&nbsp;(仅限快递)res.sendfile(path[, options[, callback]])&nbsp;(仅限快递)res.json(obj[, headers|status[, status]])&nbsp;(仅限快递)res.redirect(url[, status])&nbsp;(仅限快递)res.cookie(name, val[, options])&nbsp;(仅限快递)res.clearCookie(name[, options])&nbsp;(仅限快递)res.render(view[, options[, fn]])&nbsp;(仅限快递)res.partial(view[, options])&nbsp;(仅限快递)

暮色呼如

我有同样的问题并且意识到这是因为我在res.redirect没有return声明的情况下进行调用,所以next之后也立即调用了该函数:auth.annonymousOnly&nbsp;=&nbsp;function(req,&nbsp;res,&nbsp;next)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(req.user)&nbsp;res.redirect('/'); &nbsp;&nbsp;&nbsp;&nbsp;next();};应该是:auth.annonymousOnly&nbsp;=&nbsp;function(req,&nbsp;res,&nbsp;next)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(req.user)&nbsp;return&nbsp;res.redirect('/'); &nbsp;&nbsp;&nbsp;&nbsp;next();};
随时随地看视频慕课网APP
我要回答