안녕하세요

MongoDB - 에러: Cannot set headers after they are sent to the client 본문

스터디/코딩애플

MongoDB - 에러: Cannot set headers after they are sent to the client

sakuraop 2023. 1. 6. 22:09

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

 

요약: 클라이언트 요청 한 번에 응답을 두 번 보내려 합니다.
해결법: return 해서 응답을 한 번만 하도록 합니다.

참고: URL

 

코드입니다.

app.post("/register", (요청, 응답) => {
  // 아이디 유효성 검사
  const checkId = /^[a-zA-Z0-9]{4,20}$/;
  if (!checkId.test(요청.body.id)) {
    console.log("아디 4~20 자리의 영문자또는 숫자");
    응답.redirect("/login");
  }
  // 비밀번호 유효성 검사
  const checkPassword = /^[a-zA-Z0-9]{4,20}$/;
  if (!checkPassword.test(요청.body.password)) {
    console.log("비번 4~20 자리의 영문자또는 숫자");
    응답.redirect("/login");
  }
  // 아이디 중복 검사
  db.collection("login").findOne({ id: 요청.body.id }, (에러, 결과) => {
    if (결과) {
      console.log("아디 중복임");
      응답.redirect("/login");
    } else {
    db.collection("login").insertOne({ id: 요청.body.id, pw: 요청.body.password }, (에러, 결과) => {
      응답.redirect("/")};
    });
  });
});


가입 해봅시다.

아디 4~20 자리의 영문자또는 숫자
비번 4~20 자리의 영문자또는 숫자

=> 두 개의 출력이 동시에, 위에서 말한 에러도 발생합니다.

 

 

 

 

return 으로 응답을 한 번만 하도록 해봅시다.

app.post("/register", (요청, 응답) => {
  // 아이디 유효성 검사
  const checkId = /^[a-zA-Z0-9]{4,20}$/;
  if (!checkId.test(요청.body.id)) {
    console.log("아디 4~20 자리의 영문자또는 숫자");
    return 응답.redirect("/login");
  }

  // 비밀번호 유효성 검사
  const checkPassword = /^[a-zA-Z0-9]{4,20}$/;
  if (!checkPassword.test(요청.body.password)) {
    console.log("비번 4~20 자리의 영문자또는 숫자");
    return 응답.redirect("/login");
  }

  // 아이디 중복체크
  db.collection("login").findOne({ id: 요청.body.id }, (에러, 결과) => {
    if (결과) {
      console.log("아디 중복임");
      return 응답.redirect("/login");
    }
    db.collection("login").insertOne({ id: 요청.body.id, pw: 요청.body.password }, (에러, 결과) => {
      return 응답.redirect("/");
    });
  });
});

return 한 결과

1. ID, Password 둘다 유효성 탈락

=> 아디 4~20 자리의 영문자또는 숫자


2. Password 만 유효성 탈락

=> 비번 4~20 자리의 영문자또는 숫자


 

3. ID 중복

=> 아디 중복임