2017-11-28 10 views
0

これは私のhttpサーバーを実行するコードです。GETリクエストのキーとJSONファイルの "users"というキーを比較します。このファイルにリストされている最初の2人のユーザーのうちの1人のキーを使用すると、うまく動作しているように応答します。私はしかし、第3のユーザのキーを使用すると、403エラーで応答(それは、この(エラーのためにこれらのiamgesを見る引き起こす可能性が何the response.writeHead(403);ラインを実行します:?https://imgur.com/a/jC7znNodeJS/javascriptで「エラー:終了後に書き込む」というメッセージが表示されるのはなぜですか?

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); 
    } 
}); 

「ユーザー」JSON。ファイル(obiousの理由のために難読化されたIDの、名前とAPIkeys):これは誤りである

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

私が手:

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) 

は用心、サーバーでのライン42文字16((pathto。 server/server.js:42:16))は、 response.write(JSON.stringify(users, null, '\t'));を参照してください。

3人目のユーザーを見つけ出す前にループが長くかかっていて、その前に接続が閉じているような気がします。これは何ができますか?

私は十分な情報を提供することを願っています。そうでない場合は、私があなたの援助に役立つ追加できるものを求めてください。

P.S.英語は母国語ではなく、私はまだ高校に通っていることに注意してください。つまり、この文章には間違いがあるかもしれません。

+1

あなたのコードはループ内で 'response.end()' *を呼び出します。 *常に* "書き込み後に終了"エラーが発生します。 – Pointy

+0

ああ、私はこれに気付かなかったので、愚かです、ありがとう!私は今はあまりにも疲れていると思っています。実際に結果を考えずに物事を動かしていたのです!私は明日続けます。ありがとう! –

答えて

0

あなたはあなたがあなたの応答を記述した後、ループを終了する必要があるにも応答

後にループを実行しています。それ以外の場合は、実行を継続し、より多くの結果が得られ、さらに応答を送信しようとします。

修正は非常に簡単です。response.end();の後にtrueを返して、ループが終了するようにしてください。

あなたは、URLがキーがある場合は、おそらくことを確認したかった

間違った方法でループを作っているし、そうでない場合は403

を投げ、結果を返すしかし、あなたはそのループにelseを使用しています最初の実行時にキーを見つけることができない場合は、403を投げてループを継続します。

ここには動作コードがあります。

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}`) 
}) 

私はrequestHandlerを別の場所に移動して少しきれいにしました。

これが役に立ちます。

関連する問題