Soy bastante nuevo en Node.js y estoy teniendo algunos problemas.

Estoy usando Node.js 4.10 y Expresar 2.4.3.

Cuando intento acceder http://127.0.0.1:8888/auth/facebook, voy a ser redirigido a http://127.0.0.1:8888/auth/facebook_callback.

Entonces, recibí el siguiente error:

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)
at [object Object].pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:32:3)
at [object Object].halt (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:29:8)
at [object Object].redirect (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/authExecutionScope.js:16:8)
at [object Object].<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/auth.strategies/facebook.js:77:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:195:11)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at param (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:189:13)
at pass (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:191:10)
at Object.router [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/router.js:197:6)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at Object.auth [as handle] (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect-auth/lib/index.js:153:7)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:150:23)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at HTTPServer.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:211:3)
at Object.handle (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:105:14)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:198:15)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
node.js:134
throw e; //process.nextTick error, or 'error' event on first tick
^
Error: Can't set headers after they are sent.
at ServerResponse.<anonymous> (http.js:527:11)
at ServerResponse.setHeader (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/patch.js:50:20)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:162:13)
at next (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/http.js:207:9)
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:323:9
at /home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session.js:338:9
at Array.<anonymous> (/home/eugene/public_html/all_things_node/projects/fb2/node_modules/connect/lib/middleware/session/memory.js:57:7)
at EventEmitter._tickCallback (node.js:126:26)

La siguiente es mi código:

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 security
var 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']);
}
});
});
app.get('/noauth', function(req, res) {
console.log('Authentication Failed');
res.send('Authentication Failed');
});
app.get('/great', function( req, res) {
res.send('Supercoolstuff');
});
app.listen(8888);

Puedo saber lo que está mal con mi código?

InformationsquelleAutor DjangoRocks | 2011-08-12

23 Comentarios

  1. 948

    La res objeto en Express es una subclase de Node.js’s http.ServerResponse (leer el http.js fuente). Se le permite llamar a res.setHeader(name, value) tan a menudo como usted quiere hasta que se lo llame res.writeHead(statusCode). Después de writeHead, los encabezados son al horno y sólo puede llamar a los res.write(data), y finalmente res.end(data).

    El error «Error: no se Puede establecer encabezados después de que se envían.» significa que ya estás en el Cuerpo o en estado Finalizado, pero alguna función trató de establecer un encabezado o un código de estado. Cuando aparece este error, trate de buscar algo que intenta enviar un encabezado después de que el cuerpo ya ha sido escrito. Por ejemplo, busque las devoluciones de llamada que accidentalmente han llamado dos veces, o cualquier error que se produce después de que el cuerpo es enviado.

    En su caso, se llama res.redirect(), lo que provocó la respuesta para ser Terminado. A continuación, el código tiró un error (res.req es null). y puesto que el error ocurrió dentro de su real function(req, res, next) (no dentro de una devolución de llamada), Conecte era capaz de atrapar y luego trató de enviar una página de error 500. Pero desde las cabeceras fueron ya enviados, Node.js’s setHeader tiró el error que te vi.

    Lista completa de Nodo.js/Expreso los métodos de respuesta y cuando ellos deben ser llamados:

    Respuesta debe ser en Cabeza y permanece en Cabeza:

    1. res.writeContinue()
    2. res.statusCode = 404
    3. res.setHeader(nombre, valor)
    4. res.getHeader(nombre)
    5. res.removeHeader(nombre)
    6. res.encabezado(clave [val]) (Express sólo)
    7. res.charset = 'utf-8' (Express; sólo afecta a Expresar métodos específicos)
    8. res.contentType(tipo) (Express sólo)

    Respuesta debe ser en Cabeza y se convierte en Cuerpo:

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

    Respuesta puede estar en cualquiera de Cabeza/Cuerpo y permanece en Cuerpo:

    1. res.escriba(fragmento, encoding='utf-8')

    Respuesta puede estar en cualquiera de Cabeza/Cuerpo y se convierte en Terminado:

    1. res.final([datos], [codificación])

    Respuesta puede estar en cualquiera de Cabeza/Cuerpo y permanece en su estado actual:

    1. res.addTrailers(encabezados)

    Respuesta debe ser en Cabeza y se convierte en Terminado:

    1. return next([err]) (Conectar/Express sólo)
    2. Excepciones dentro de middleware function(req, res, next) (Conectar/Express sólo)
    3. res.enviar(cuerpo|estado[, encabezados|estado[, estado]]) (Express sólo)
    4. res.el apego(nombre de archivo) (Express sólo)
    5. res.sendfile(path[, opciones[, devolución de llamada]]) (Express sólo)
    6. res.json(obj[, encabezados|estado[, estado]]) (Express sólo)
    7. res.redirect(url[, estado]) (Express sólo)
    8. res.cookie(nombre, val [opciones]) (Express sólo)
    9. res.clearCookie(nombre [opciones]) (Express sólo)
    10. res.render(ver[, opciones [fn]]) (Express sólo)
    11. res.parcial(ver [opciones]) (Express sólo)
    • devolución de llamada dos veces fue mi problema – thx.
    • Yep, de verificación para llamar a next() u otros cb dos veces.
    • Expresar los enlaces que parece muerto
    • también mirar hacia fuera para este error clásico: res.redirect() no detiene la ejecución de la instrucción… así que el regreso después de ella. De lo contrario, otro código que puede ser ejecutado lo que podría unintentiallly causa el famoso error de cabecera. Gracias por la explicación!
    • Su general, una buena idea es utilizar un retorno al final de su devolución de llamada para evitar esto
    • He hecho un pequeño error en mi middleware, yo no return antes de next(), gracias esto me señaló el error!
    • el expreso de la documentación muestra «enviar» para la Respuesta, pero no se menciona la «escritura» en todos los…
    • Asegúrese de que la siguiente función no se ejecuta antes de enviar. Tengo este error, ya hice eso y expresar envió su mensaje de error antes de ejecutar la respuesta.enviar
    • ¿Qué acerca de la comprobación: res.finished?
    • Gracias por explicar esto – resuelto mi problema 🙂
    • me he quitado el next() el error desaparece
    • Gracias por la respuesta me salvó un montón de tiempo

  2. 91

    Me encontré con este error así por un tiempo. Creo (espero) que he envuelto todo esto en mi cabeza, quería escribir aquí por referencia.

    Al agregar middleware para conecte o express (que se basa en conectar) el uso de la app.use método, estás añadiendo elementos a Server.prototype.stack en conectar (al menos con la actual npm install connect, que se ve muy diferente de la de github como el de este post). Cuando el servidor recibe una solicitud, se itera a través de la pila, llamando a la (request, response, next) método.

    El problema es que, si en uno de los middleware artículos que escribe para el cuerpo de la respuesta o cabeceras (parece bien/o por alguna razón), pero no llama response.end() y llamar next() entonces como el núcleo Server.prototype.handle método se complete, se va a notar que:

    1. que no hay más elementos en la pila, y/o
    2. que response.headerSent es cierto.

    Así, se produce un error. Pero el error que arroja es sólo esta respuesta básica (desde el conectar http.js código fuente:

    res.statusCode = 404;
    res.setHeader('Content-Type', 'text/plain');
    res.end('Cannot ' + req.method + ' ' + req.url);

    Allí, llama a res.setHeader('Content-Type', 'text/plain');, que es probable que usted haya establecido en su render método, sin llamar a la respuesta.end(), algo así como:

    response.setHeader("Content-Type", "text/html");
    response.write("<p>Hello World</p>");

    La forma en que todo debe ser estructurado es como este:

    Buena Middleware

    //middleware that does not modify the response body
    var doesNotModifyBody = function(request, response, next) {
    request.params = {
    a: "b"
    };
    //calls next because it hasn't modified the header
    next();
    };
    //middleware that modify the response body
    var doesModifyBody = function(request, response, next) {
    response.setHeader("Content-Type", "text/html");
    response.write("<p>Hello World</p>");
    response.end();
    //doesn't call next()
    };
    app.use(doesNotModifyBody);
    app.use(doesModifyBody);

    Problemática Middleware

    var problemMiddleware = function(request, response, next) {
    response.setHeader("Content-Type", "text/html");
    response.write("<p>Hello World</p>");
    next();
    };

    La problemática de middleware establece el encabezado de respuesta sin llamar response.end() y llamadas next(), que confunde a conectar el servidor.

    • +1 Esta es una gran explicación, pero lo que sobre el caso cuando se utiliza res.redirect()? Frecuentemente me encuentro con este problema cuando el middleware está tratando de redirigir basado en alguna condición. Debe middleware no redirect, por su «Middleware» ejemplo?
    • Usted sabe que tengo este problema exacto debido a lo que ustedes llaman una problemática middleware, sin embargo necesito un caso en el que me devuelve la respuesta, pero quisiera hacer el procesamiento adicional de un controlador separado como parte de la cadena, ¿cómo ir sobre la supresión de este error?
  3. 44

    Tuve este mismo problema y se dio cuenta de que era porque me estaba llamando res.redirect sin return declaración, por lo que el next función también se llama inmediatamente después:

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

    Que debería haber sido:

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

    Mucha gente de golpe este error. Es un lío esto con async procesamiento. Más probable es que algunos de su código de configuración de encabezados en el primer pulso y, a continuación, se ejecuta un async de devolución de llamada en un futuro de la marca. En el medio, el encabezado de respuesta se envía, pero luego de más de encabezados (como un 30X redirigir) intente agregar encabezados adicionales, pero es demasiado tarde ya que el encabezado de respuesta ya ha sido transmitida.

    No estoy seguro exactamente lo que está causando el error, pero mira las devoluciones de llamada como áreas potenciales para investigar.

    Un sencillo consejo para simplificar el código. Deshacerse de app.configure() y sólo llamar app.use directamente en su nivel superior alcance.

    Véase también el everyauth módulo, que hace Facebook y una docena de otras 3ª parte de los proveedores de autenticación.

    • ¿Qué es un 30X redirect?
    • Un 30X redirigir es un código de respuesta HTTP. w3.org/Protocols/rfc2616/rfc2616-sec10.html Códigos de 300-399 diferentes variaciones de la redirección, con 302 y 301 está siendo utilizado para enviar al cliente a una URL alternativa. Cuando haces la respuesta.redirect(…) en el nodo, un 30X redirigir encabezado será enviado en la respuesta.
    • Ohhhh. Me estaba imaginando 30 redirecciones en una fila o algo
  5. 35

    Algunas de las respuestas en este Q&a, están equivocados. El aceptó la respuesta es también no muy «práctico», por lo que quiero publicar una respuesta que explica las cosas en términos más sencillos. Mi respuesta va a cubrir el 99% de los errores que veo publicado una y otra vez. Por las razones reales detrás de el error de echar un vistazo a la aceptada respuesta.


    HTTP utiliza un ciclo que requiere de una respuesta por cada petición. Cuando el cliente envía una solicitud (por ejemplo, POST o GET) el servidor debe enviar sólo una respuesta de vuelta.

    Este mensaje de error:

    Error: no se Puede establecer encabezados después de que se envían.

    generalmente ocurre cuando se envía varias respuestas para una solicitud. Asegúrese de que las siguientes funciones son llamadas sólo una vez por cada solicitud:

    • res.json()
    • res.send()
    • res.redirect()
    • res.render()

    (y un par más que rara vez se utilizan, consulte la aceptada respuesta)

    La ruta de devolución de llamada no va a volver cuando estas res se llama a funciones. Se continuará ejecutando hasta que se llega al final de la función o de una instrucción return. Si desea volver al enviar una respuesta, puedes hacerlo así: return res.send().


    Tomemos por ejemplo este código:

    app.post('/api/route1', function(req, res) {
    console.log('this ran');
    res.status(200).json({ message: 'ok' });
    console.log('this ran too');
    res.status(200).json({ message: 'ok' });
    }

    Cuando un mensaje se envía la solicitud a /api/route1 se ejecutará cada línea en la devolución de llamada. Un no se Puede establecer encabezados después de que se envían mensaje de error se produce porque res.json() se llama dos veces, lo que significa dos respuestas se envían.

    Sólo una respuesta puede ser enviada por solicitud!


    El error en el ejemplo de código anterior era obvio. Más típico problema es cuando usted tiene varias ramas:

    app.get('/api/company/:companyId', function(req, res) {
    const { companyId } = req.params;
    Company.findById(companyId).exec((err, company) => {
    if (err) {
    res.status(500).json(err);
    } else if (!company) {
    res.status(404).json();      //This runs.
    }
    res.status(200).json(company); //This runs as well.
    });
    }

    Esta ruta con adjunto de devolución de llamada se encuentra una empresa en una base de datos. Cuando se hace una consulta para una empresa que no existe, de que vamos a conseguir en el interior de la else if rama y enviar una respuesta 404. Después de eso, vamos a continuar con la siguiente declaración, que también envía una respuesta. Ahora tenemos que enviar a dos de las respuestas y el mensaje de error se producirá. Podemos solucionar este código asegurándose de que sólo enviamos una respuesta:

    .exec((err, company) => {
    if (err) {
    res.status(500).json(err);
    } else if (!company) {
    res.status(404).json();         //Only this runs.
    } else {
    res.status(200).json(company);
    }
    });

    o mediante la devolución cuando se envía la respuesta:

    .exec((err, company) => {
    if (err) {
    return res.status(500).json(err);
    } else if (!company) {
    return res.status(404).json();  //Only this runs.
    }
    return res.status(200).json(company);
    });

    Un gran pecador es asincrónica funciones. Asumir la función de este pregunta, por ejemplo:

    article.save(function(err, doc1) {
    if (err) {
    res.send(err);
    } else {
    User.findOneAndUpdate({ _id: req.user._id }, { $push: { article: doc._id } })
    .exec(function(err, doc2) {
    if (err) res.send(err);
    else     res.json(doc2);  //Will be called second.
    })
    res.json(doc1);             //Will be called first.
    }
    });

    Aquí tenemos una función asíncrona (findOneAndUpdate()) en el ejemplo de código. Si no hay errores (err) findOneAndUpdate() será llamado. Debido a que esta función es asincrónico la res.json(doc1) será llamado inmediatamente. Se asume que no hay errores en findOneAndUpdate(). El res.json(doc2) en el else será llamado. Dos respuestas han sido ya enviados y el no se Puede establecer encabezados mensaje de error se produce.

    La revisión, en este caso, sería quitar el res.json(doc1). Para enviar tanto docs de vuelta al cliente la res.json() en la otra podría ser escrito como res.json({ article: doc1, user: doc2 }).

    • Está dentro de una función asíncrona, y debe return la res.json
    • Mi problema fue el uso de res.send en bucle for.
    • Esto me ayudó en el final para entender y solucionar el problema, Gracias mucho 🙂
    • Gran respuesta! Gracias por explicar tan bien.
    • muchas gracias a ahorrar mi tiempo.
    • Esta es definitivamente la mejor respuesta!
    • Bonita explicación
    • Esto debe ser aceptado respuesta. Me salvó un montón de tiempo

  6. 15

    Me hierve mi cabeza sobre esta cuestión y ha sucedido debido a un descuido error en el manejo de las devoluciones de llamada. no volvió devoluciones de llamada de provocar la respuesta de set dos veces.!

    Mi programa tenía un código para validar la solicitud y consulta de la base de datos. después de validar si el error está ahí, me estaba llamando de nuevo la index.js con los errores de validación .
    Y si pasa la validación va por delante y golpeó a la db con el éxito/fracaso.

        var error = validateRequestDetails("create",queryReq);
    if (error)
    callback(error, null);
    else
    some code 
    callback(null, success);

    Lo que estaba sucediendo es : en el Caso de error de la validación de la devolución de llamada de llamado y respuesta a establecer. Pero no regresó. Por lo tanto continúa el método que se va a db y golpeó el éxito/fracaso . Llama a la misma devolución de llamada causando de nuevo la respuesta de establecer dos veces ahora.

    Así que la solución es simple, usted necesita para «devolver» la devolución de llamada de modo que el método no continuar con la ejecución, una vez que el error se ha producido y, por tanto, establecer el objeto de respuesta de una vez

      var error = validateRequestDetails("create",queryReq);
    if (error)
    callback(error, null);
    return;
    else
    some code 
    callback(null, success);
    • Gracias! Esto resultó ser mi problema. Acabo de hacer un ctrl+f y se encontró una callback(...) sin return; después de que fue eventualmente causando res.send(...) a ser llamado dos veces.
  7. 13

    Este tipo de error que se obtiene al pasar declaraciones después de enviar una respuesta.

    Por ejemplo:

    res.send("something response");
    console.log("jhgfjhgsdhgfsdf");
    console.log("sdgsdfhdgfdhgsdf");
    res.send("sopmething response");

    Va a provocar el error que usted está viendo, porque una vez que la respuesta ha sido enviada, el siguiente res.send no se ejecutará.

    Si quieres hacer algo, debes hacerlo antes de enviar la respuesta.

    • Esto fue exactamente mi problema 🙂
  8. 5

    A veces usted puede obtener este error cuando intenta llamar a next() la función después de res.final o res.enviar , intente eliminar si usted tiene next() después de la res.enviar o res.final en su función.
    Nota: aquí next() significa después de responder al cliente con su respuesta(yo.e res.enviar o res.final) que todavía están tratando de ejecutar algún código para responder de nuevo por lo que no es legal.

    Ejemplo :

    router.get('/',function (req,res,next){
    res.send("request received");
    next(); //this will give you the above exception 
    });

    quitar next() de la función de arriba y va a trabajar.

  9. 3

    En mi caso fue una respuesta 304 (caché) que estaba causando el problema.

    Solución más fácil:

    app.disable('etag');

    Solución alternativa aquí si desea más control:

    http://vlasenko.org/2011/10/12/expressconnect-static-set-last-modified-to-now-to-avoid-304-not-modified/

    • En mi caso también 304 respuesta. I a m el uso de Fibras para su procesamiento. De cualquier manera, su respuesta es de gran ayuda. gracias
    • ¿Alguien puede explicar lo que las consecuencias para la eliminación de la cabecera etag?
    • ETags permitir que el servidor no enviar contenido que no ha cambiado. Desactivar desactiva esta función. El ETag entrada de la wikipedia (en.wikipedia.org/wiki/HTTP_ETag) tiene una explicación más detallada.
  10. 3

    En mi caso esto sucedió con Reaccionar y postal.js cuando no estaba de darse de baja de un canal en el componentWillUnmount de devolución de llamada de mi Reaccionan componente.

  11. 2

    Para cualquier persona que viene a este y ninguna de las otras soluciones ayudado, en mi caso esto se manifiesta en una ruta que se encargó de subir una imagen pero no se manejar tiempos de espera, y por lo tanto, si la carga se tomó demasiado tiempo y agotado, cuando la devolución de llamada fue despedido después de que el tiempo de espera de la respuesta había sido enviado, llamando res.send() resultó en la caída, ya que las cabeceras estaban ya establecidos en cuenta para el tiempo de espera.

    Este fue reproducido fácilmente mediante el establecimiento de un muy corto tiempo de espera y golpear la ruta con un decentemente-tamaño de la imagen, el accidente fue reproducido en todo momento.

    • ¿cómo controlar el tiempo de espera para evitar esto?
  12. 2

    Sólo se inclinó este. Usted puede pasar las respuestas a través de esta función:

    app.use(function(req,res,next){
    var _send = res.send;
    var sent = false;
    res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
    };
    next();
    });
  13. 2

    Agregar este middlware y funcionará

    app.use(function(req,res,next){
    var _send = res.send;
    var sent = false;
    res.send = function(data){
    if(sent) return;
    _send.bind(res)(data);
    sent = true;
    };
    next();
    });
  14. 2

    Esto sucede cuando la respuesta fue entregado al cliente y una vez más usted está tratando de dar respuesta. Usted tiene que comprobar en el código que en algún lugar vas a devolver la respuesta al cliente una vez más que la causa de este error. Recepción y entrega de respuesta a la vez cuando se desea devolver.

  15. 2

    Si usted está usando funciones de devolución de llamada uso return después de la err bloque. Este es uno de los escenarios en los que este error puede ocurrir.

    userModel.createUser(data, function(err, data) {
    if(err) {
    res.status = 422
    res.json(err)
    return //without this return the error can happen.
    }
    return res.json(data)
    })

    Probado en la versión de Nodo v10.16.0 y expresar 4.16.4

  16. 1

    Vino aquí desde nuxt, el problema era que en el componente del asyncData método, se me olvidó return promesa de capturar los datos y la configuración de encabezado de allí.

  17. 0

    En Manuscrito, mi problema fue que no me cierre la conexión websocket después de recibir un mensaje.

    WebSocket.on("message", (data) => {
    receivedMessage = true;
    doSomething(data);
    localSocket.close(); //This close the connection, allowing 
    });
  18. 0

    Si usted din no obtener ayuda desde arriba : para los noobs
    La razón detrás de este error es el envío de la solicitud varias veces vamos a entender de algunos casos:-
    1. `

    module.exports = (req,res,next)=>{
    try{
    const decoded  = jwt.verify(req.body.token,"secret");
    req.userData = decoded;
    next();
    }catch(error){
    return res.status(401).json({message:'Auth failed'});
    }
    next();   
    }

    `
    en la anterior llamada next() dos veces, se producirá un error de


    1. router.delete('/:orderId', (req, res, next) => {
      Order.remove({_id:req.params.orderId},(err,data)=>{
      if(err){
      **res.status(500).json(err);**
      }else{
      res.status(200).json(data);
      }
      *res.status(200).json(data);*
      })
      })

    aquí responder es enviar dos veces comprobar si ya ha enviado una respuesta

  19. 0

    Tuve este problema cuando estaba de anidación de las promesas. Una promesa dentro de una promesa de que volvería a 200 en el servidor, pero luego el exterior de la promesa de la captura de instrucción de retorno de 500. Una vez que me fijo, el problema se fue.

  20. 0

    En mi caso, esto sucede debido a las múltiples incidencias. He llamado next() método de tiempos múltiples durante el código

  21. 0

    Por favor, compruebe si su código es la devolución de varios res.enviar() instrucciones para una sola solicitud. Como cuando tuve este problema….

    Yo tenía este problema en mi restify nodo de la aplicación. El error fue que

    switch (status) {
    case -1:
    res.send(400);
    case 0:
    res.send(200);
    default:
    res.send(500);
    }

    Yo estaba manejando varios casos con interruptor sin escribir descanso. Para aquellos poco familiarizados con el interruptor caso sabemos que sin romper, volver a las palabras clave. El código, en virtud del caso y la próxima líneas de la misma será ejecutada no importa qué. Así que aunque me quieres enviar una sola res.enviar, debido a este error fue la devolución de varios res.enviar declaraciones, lo que llevó a

    error cant establecer encabezados después de que se envía al cliente. Que se resolvió mediante la adición de este o el uso de retorno antes de cada res.método send() como return res.enviar(200)

    switch (status) {
    case -1:
    res.send(400);
    break;
    case 0:
    res.send(200);
    break;
    default:
    res.send(500);
    break;
    }

  22. 0

    Todo lo que tenía que hacer en el caso de este error fue res.end().

     auth.annonymousOnly = function(req, res, next) {
    //add other task here   
    res.end();    
    };

    El otro problema que usted podría estar enfrentando es que hay un código después de la res.json y res. escribir. En este caso, usted necesita utilizar para volver a detener la ejecución después de que.

     auth.annonymousOnly = function(req, res, next) {
    if(!req.body.name)
    {
    res.json({error:"some error"});
    return;
    }
    let comp = "value"; //this is the code after res.json which may cause some problems so you have to use return 
    };
  23. 0

    Es muy probable que esto es más de un nodo cosa, el 99% del tiempo, es un doble de devolución de llamada causando a responder dos veces, o siguiente()ing dos veces, etc, absolutamente seguro. Solucionado mi problema fue el uso de next() dentro de un bucle. Extraiga el siguiente() desde el bucle o dejar de llamar más de una vez.

Dejar respuesta

Please enter your comment!
Please enter your name here