» Poradna » Programy

[ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

 |   |  Microsoft Windows 10 Chrome 80.0.3987.149

Dobrý den,mám node js project u kterého většina věcí funguje dobře, ale jedna možnost házi error z titulku. vpninfo.py sám o sobě funguje, chtěl jsem pro něj udělat webové rozhraní. Normálně vpninfo předává index.js zhruba 200 znaků textu, to funguje dobře. Nefunguje ale možnost ALL, která vrací asi 1000000 znaků. Z těch 1000000 znaků se vypíše 1/4, protože to stihne projít jeden ze 4 cyklů v pythonu(for asa in listasas) a ten to hned odevzdá. Stránka se sice načte a vypíše to co má, ale celý server potom spadne s errorem z titulku. Napadá mě, že je to proto ze se ten python nestihne zpracovat a ten node na něj nepočká. Nevíte čím to může být a jak to spravit?projekt: https://github.com/lukinececek/python-web-in...

Mohlo by vás také zajímat

Odpovědi na otázku

 |   |  Microsoft Windows 10 Chrome 80.0.3987.149

Dobrý den,zjednodušil jsem vám zadání, mám 3 soubory dostupné zde (https://github.com/lukinececek/req.next-not-... ). Výstup by měla být stránka s čísly 1 až 10000, každé na novém řádku. Co to ale udělá je, že to vypíše stránku s čísly 1 až 1550 a celý node js server spadne. Je nějaká možnost jak upravit ty soubory aby to fungovalo?hello.pyimport sysfor i in range(10000): print(i)sys.stdout.flush()index.jsconst express = require('express')const app = express()const bodyParser = require('body-parser')app.set('view engine', 'ejs')app.use(bodyParser.urlencoded({ limit: '10mb', extended: false }))app.get("/", (req, res) => { const spawn = require("child_process").spawn const pythonProcess = spawn('python', ["./hello.py"]) pythonProcess.stdout.on('data', (data) => { results = data.toString().split("\r\n") res.render("../index.ejs", {results}) })})app.listen(process.env.PORT || 3000)index.ejs<h2>Results:</h2><% results.forEach(result => { %> <% if (result.length == 0) { %> <br> <% } %> <div><%= result %> </div><% }) %>

Souhlasím  |  Nesouhlasím  |  Odpovědět
 | Microsoft Windows 10 Firefox 74.0

Je to stejné jako u jakéhokoli jazyku, který tvoří výstup pro web a ta chyba Ti to i říká. Když jednou odešleš obsah, už nemůžeš měnit nebo upřesňovat hlavičky. Tady odchytáváš v nějakém intervalu výstup a už během odchytávání se snažíš vytvořit výsledek. Metoda render pro zobrazení výstupu ale musí poslat informci o obsahu - content-type: text/html atd. Na opakovaném volání pak vše spadne, protože znovu posílá hlavičky. Když chceš vygenerovat rovnou HTML stránku a neděláš nějkého asynchroního klienta na straně frontendu, řešením je počkat na data a stránku vykreslit až následovně.https://ctrlv.cz/EsAN

Souhlasím  |  Nesouhlasím  |  Odpovědět
 |   |  Microsoft Windows 10 Chrome 80.0.3987.149

Kdyby někoho zajímala správná odpověď tak je to toto:router.get('/', (req, res) => { const pythonProcess = spawn('python', ['./hello.py']); let result = []; // this listener will keep triggering until all chunks are received pythonProcess.stdout.on('data', data => { result = result.concat(data.toString().split('\r\n')); }); // on.exit() will indicate that process has finished pythonProcess.on('exit', code => { console.log(`process has finished and exited with code: ${code}`); res.render('../index.ejs', { result }); });});

Souhlasím  |  Nesouhlasím  |  Odpovědět

Související témata: GitHub