Zrobiłem to od zera i wciąż daje mi to błąd ...
Uruchomiłem
express test
następnie
cd test && npm install
Edytowałem app.js, dodając taką trasę:
app.get("/test",function(req,res) {
res.writeHead(200, {"Content-Type": "application/json"});
return res.send("{"a":3}");
});
Potem uruchomiłem węzeł
node app.js
A kiedy próbuję uzyskać dostęp http://server/test dostaję
Error: Can"t set headers after they are sent.
Używam Węzeł v4.2.1, Express 2.5.8, npm 3.4.0.
Dzieje się tak po prostu z Express, jeśli utworzę prosty serwer na Węźle, mogę użyć writeHead.
Odpowiedzi:
1 dla odpowiedzi № 1Gdy res.writeHead(200, {"Content-Type": "application/json"});
, wysyłasz wszystkie nagłówki odpowiedzi do klienta, więc nie możesz ponownie wysłać nagłówka.
Bo res.send
jest funkcją obiektu odpowiedzi express, szukam kodu źródłowego tej funkcji wysyłania:
fragment jest tym, co tutaj wysyłasz: String („{„ a ”: 3}”)
this.set("Content-Type", setCharset(type, "utf-8"))
tutaj express pomaga nam połączyć nasz typ zawartości z utf-8, więc serwer musi ponownie wysłać nagłówek
Dlatego pojawia się błąd.
Ps. Przepraszam za mój zły angielski i mam nadzieję, że rozumiesz, co próbuję wyjaśnić.
1 dla odpowiedzi nr 2
A co z używaniem res.setHeader
var express = require("express");
var app = express();
app.get("/", function (req, res) {
res.setHeader("Content-Type","application/json");
res.send("{}");
});
var server = app.listen(3000, function () {
var host = "localhost";
var port = server.address().port;
console.log("Example app listening at http://%s:%s", host, port);
});