2017-11-28 23 views
0

내 http 서버를 실행하는 코드이므로 GET 요청의 키를 JSON 파일의 "users"키와 비교합니다 (아래쪽으로 조금 더 보여줍니다). 이 파일에 나열된 처음 두 사용자 중 하나의 키를 사용하면 제대로 작동하고 원하는대로 응답합니다. 나는 그러나 세 번째 사용자의 키를 사용하는 경우, 그것은 403 오류로 응답 (그것은 the response.writeHead(403); 라인을 실행 (이 원인이 오류에 대해이 iamges을 볼 수 있었다 무엇 :.? https://imgur.com/a/jC7zn)NodeJS/javascript에서 "Error : end after write"가 표시되는데 어떻게 될까요?

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 이유로 난독 아이디의, 이름과 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 ((한마리. server/server.js : 42 : 16))는 response.write(JSON.stringify(users, null, '\t'));을 가리 킵니다.

제 3의 사용자를 찾기 전에 너무 오래 걸리는 루프와 관련이 있고 그 전에 연결이 닫히는 것처럼 느껴집니다. 이게 뭐야?

나는 충분한 정보를 제공했으면 좋겠다. 그렇지 않다면, 내가 당신의 원조에 도움이 될 수있는 다른 것들을 요청해야한다.

P. 영어가 모국어가 아니며 아직 고등학교에 다니고 있다는 것을 명심하십시오. 즉,이 텍스트에 몇 가지 실수가있을 수 있음을 의미합니다.

+1

코드는 루프 내에서'response.end()'*를 호출합니다. * 항상 * "write after 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를 별도의 장소로 옮겼다.

희망이 도움이됩니다.