2017-11-28 3 views
0

Dies ist der Code, der meinen http-Server ausführt, er vergleicht einen Schlüssel in einer GET-Anfrage mit den Schlüsseln in einer JSON-Datei namens "users", etwas weiter unten gezeigt. Wenn ich den Schlüssel eines der ersten beiden Benutzer in dieser Datei verwende, funktioniert es einwandfrei und reagiert genau so, wie ich es möchte. Als ich den Schlüssel des dritten Benutzer verwenden jedoch mit einem 403-Fehler reagiert (es läuft the response.writeHead(403); Linie Was dies dazu führen könnten (diese iamges für die Fehler sehen.? https://imgur.com/a/jC7zn)Ich bekomme einen "Fehler: schreibe nach Ende" in NodeJS/Javascript, was könnte das verursachen?

var httpserver = http.createServer(function(request, response) { 
    try { 
    var key = ''; 
    if (request.url.indexOf('k=') != -1) { 
     key = request.url.substring(request.url.indexOf('k=') + 2); 
    } 
    for (i = 0; i < Object.keys(users).length; i++) { 
     if (users[Object.keys(users)[i]].apikey == key) { 
     response.writeHead(200, { 
      'Content-Type': 'application/json' 
     }); 
     response.write(JSON.stringify(users, null, '\t')); 
     response.end(); 
     } else { 
     response.writeHead(403); 
     response.end(); 
     } 
    } 
    } catch (err) { 
    console.log(err); 
    } 
}); 

Die „Benutzer“ JSON Datei (ids, Namen und APIkeys für obious Gründen verschleiert):

{ "user1": { 
     "auth": "3", 
     "name": "Name1", 
     "apikey": "key1" }, 
    "user2": { 
     "auth": "3", 
     "name": "Name2", 
     "apikey": "key2" }, 
    "user3": { 
     "auth": "3", 
     "name": "Name3", 
     "apikey": "key3" } 
} 

Dies ist der Fehler, die ich bekomme:

Error: write after end 
    at write_ (_http_outgoing.js:625:15) 
    at ServerResponse.write (_http_outgoing.js:620:10) 
    at Server.<anonymous> (pathtoserver/server.js:42:16) 
    at emitTwo (events.js:126:13) 
    at Server.emit (events.js:214:7) 
    at parserOnIncoming (_http_server.js:602:12) 
    at HTTPParser.parserOnHeadersComplete (_http_common.js:117:23) 

Vorsicht, Zeile 42 Zeichen 16 (bei Server (pathto. server/server.js: 42: 16)) bezieht sich auf response.write(JSON.stringify(users, null, '\t')); In dem Code an der Spitze.

Ich habe das Gefühl, dass es etwas damit zu tun hat, dass die Schleife zu lange dauert, bevor der dritte Benutzer gefunden wird, und die Verbindung zuvor geschlossen wurde. Was könnte das sein?

Ich hoffe, dass ich genug Informationen zur Verfügung gestellt habe, und wenn nicht, sicher sein, nach anderen Dingen zu fragen, die ich hinzufügen könnte, die deiner Hilfe nützen werden!

P.S. Bitte seien Sie vorsichtig, dass Englisch nicht meine Muttersprache ist und dass ich immer noch auf der Highschool bin, was bedeutet, dass es in diesem Text einige Fehler geben könnte.

+1

Ihr Code ruft 'response.end()' * innerhalb der Schleife * auf. Es wird * immer * einen Fehler "Schreiben nach Ende" erhalten. – Pointy

+0

Oh Mann, ich bin so dumm, dass ich das nicht bemerkt habe, danke! Ich denke, ich bin im Moment einfach zu müde, und dass ich die Dinge herumwälze, ohne wirklich an die Konsequenzen zu denken! Ich werde morgen weiter machen. Vielen Dank! –

Antwort

0

Sie führen die Schleife auch nach Reaktion

Sie müssen die Schleife verlassen, nachdem Sie Ihre Antwort schreiben. Andernfalls wird es weiter ausgeführt und es werden mehr Ergebnisse erzielt, und es wird versucht, mehr Antworten zu senden.

Das Update ist ziemlich einfach, fügen Sie einfach eine Rückgabe wahr nach response.end();, die sicherstellen, dass die Schleife beendet wird.

Sie machen die Schleife in einer falschen Weise

Sie wahrscheinlich sicherstellen wollte, ob die URL-Taste hat, dann wieder das Ergebnis, sonst werfen 403.

Aber Sie verwendet else in dieser Schleife die Wenn der Schlüssel beim ersten Durchlauf nicht gefunden werden kann, wird 403 ausgelöst und die Schleife wird fortgesetzt.

Hier ist ein Arbeitscode.

const http = require('http') 
const port = process.env.PORT; 

const requestHandler = (request, response) => { 
    try { 
    var key = ''; 

    if (request.url.indexOf('k=') !== -1) { 
     key = request.url.substring(request.url.indexOf('k=') + 2); 
    } 

    // Make sure there is a key and it's not empty 
    // if it's not empty, then run the loop. 
    if(key.length){ 
    for (let i = 0; i < Object.keys(users).length; i++) { 
     if (users[Object.keys(users)[i]].apikey == key) { 
     response.writeHead(200, { 
      'Content-Type': 'application/json' 
     }); 
     response.write(JSON.stringify(users, null, '\t')); 
     response.end(); 
     return; // if a result is found, then exit the loop 
     } 
    } 
    } 

    // if it's empty, then throw 403 
    else { 
     response.writeHead("403"); 
     response.end(); 
     } 
    } catch (err) { 
    console.log(err); 
    } 
} 

const server = http.createServer(requestHandler) 
server.listen(port, (err) => { 
    if (err) { 
    return console.log('something bad happened', err) 
    } 

    console.log(`server is listening on ${port}`) 
}) 

zog ich die Request an einem separaten Ort, um es ein wenig sauber zu halten.

Hoffe, das hilft.

Verwandte Themen