Error: INSERT INTO `kin_1_1040202` (subject, seo_subject, content, page, description, og_image, time) VALUES ('node.js 오류', 'node.js+%EC%98%A4%EB%A5%98', '
\n \n \n
웹사이트를 제작하는 과정에서 리엑트와 서버를 키고
\n

\n
웹에서 전송 버튼을 누르면 서버 콘솔에 방 등록 결과가 찍혀야하고 DB에도 저장이 돼야 합니다
\n

\n
그런데 전송 버튼을 누르면 이미지에 대한 정보만 넘어오고 다른 정보가 서버로 넘어오지 않고
\n

\n
\n
Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
\n
    at ServerResponse.setHeader (_http_outgoing.js:558:11)
\n
    at ServerResponse.header (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express
\n
    at ServerResponse.send (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express\\l
\n
    at C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\server.js:82:21
\n
    at Layer.handle [as handle_request] (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modu
\n
    at next (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express\\lib\\router\\route
\n
    at Route.dispatch (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express\\lib\\ro
\n
    at Layer.handle [as handle_request] (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modu
\n
    at C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express\\lib\\router\\index.js:28
\n
    at Function.process_params (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\expre
\n
\n

\n
이런 에러가 발생합니다 axios 통신은 포스트맨으로 사용을 했습니다
\n

\n
(포스트맨으로 임의의 값을 입력하고 넣었을 때는 디비에 잘 들어갑니다)
\n

\n
코드 올려봅니다
\n

리엑트 파일

\n
\n
\nimport \"./index.css\";\n
\n
\nimport axios from \"axios\";\n
\n
\nimport { useState } from \"react\";\n
\n
\nimport { Button, Divider, Form, Input, InputNumber, Upload } from \"antd\";\n
\n
\nimport { Switch, Route, Link, useHistory } from \"react-router-dom\";\n
\n
\nimport { API_URL } from \"../config/constants\"; //서버주소 API_URL Ctrl+좌클릭이동 주소수정가능\n
\n
\nfunction RoomRegisPage() {\n
\n
  
\n
\n  const [imageUrl, setImageUrl] = useState(null);\n
\n
\n  const onSubmit = (values) => {\n
\n
\n    console.log(values);\n
\n
    
\n
\n    axios
\n
\n      .post(`${API_URL}/Rooms`, {\n
\n
\n        //서버통신해서 DB로 보내는것\n
\n
\n        address1: values.adr1,\n
\n
\n        address2: values.adr2,\n
\n
\n        address3: values.adr3,\n
\n
\n        address4: values.adr4,\n
\n
\n        datein: values.datein,\n
\n
\n        dateOut: values.dateout,\n
\n
\n        roomtype: values.roomtype,\n
\n
\n        people:values.people,\n
\n
\n        price: parseInt(values.price),\n
\n
\n        description: values.description,\n
\n
\n        imageurl:values.imageurl,\n
\n
\n      })\n
\n
\n      .then((result) => {\n
\n
\n        console.log(result);\n
\n
\n      }).catch(function (error){\n
\n
\n        console.error(error);\n
\n
\n      });\n
\n
\n  };\n
\n
\n  const onChangeImage = (info) => {\n
\n
\n    if (info.file.status === \"uploading\"{\n
\n
\n      return;\n
\n
\n    }\n
\n
\n    if (info.file.status === \"done\"{\n
\n
\n      const response = info.file.response;\n
\n
\n      const imageUrl = response.imageUrl;\n
\n
\n      setImageUrl(imageUrl);\n
\n
\n    }\n
\n
\n  };\n
\n
\n  return (\n
\n
\n    <div>\n
\n
      <div id=\"header\">\n
\n
        <div id=\"header-area\">\n
\n
          <Link to=\"/\">\n
\n
            <img src=\"../images/logo.png\" id=\"logo\" alt=\"logo\" />\n
\n
          </Link>\n
\n
        </div>\n
\n
      </div>\n
\n
      <div className=\"regiscontainer\">\n
\n
        <h1>방 등록 페이지</h1>\n
\n
        <div className=\"roomRegisBox\">\n
\n
          <Form name=\"방등록\" onFinish={onSubmit}>\n
\n
            <div className=\"roomDetail\">\n
\n
              <Form.Item name=\"upload-pic\">\n
\n
                <div className=\"roomPic\">\n
\n
                  <Upload\n
\n
\n                    name=\"image\"\n
\n
\n                    action={`${API_URL}/image`//이미지가 올라갈 링크\n
\n
\n                    listType=\"picture\"\n
\n
\n                    showUploadList={false}\n
\n
\n                    onChange={onChangeImage}\n
\n
\n                  >\n
\n
                    {imageUrl ? (
\n
                      <img\n
\n
\n                        id=\"upload-img\"\n
\n
\n                        src={`${API_URL}/${imageUrl}`//이미지가 올라갈 링크\n
\n
\n                      />\n
\n
                    ) : (
\n
                      <div id=\"upload-img-placeholder\">\n
\n
                        <img src=\"/images/camera.png\" />\n
\n
                        <span>이미지를 업로드해주세요.</span>\n
\n
                      </div>\n
\n
                    )}\n
\n
                  </Upload>\n
\n
                </div>\n
\n
              </Form.Item>\n
\n
              <div className=\"roomDetailsec\">\n
\n
                <div className=\"Detailsec\">\n
\n
                  <span className=\"adrspan\">주소</span>\n
\n
                  <Form.Item name=\"address1\">\n
\n
                    <select className=\"searchboxselect\">\n
\n
                      <option>도시선택</option>\n
\n
                      <option value=\"서울\">서울</option>\n
\n
                    </select>\n
\n
                  </Form.Item>\n
\n
                  <Form.Item name=\"address2\">\n
\n
                    <select className=\"searchboxselect\">\n
\n
                      <option>구선택</option>\n
\n
                      <option value=\"강남구\">강남</option>\n
\n
                      <option value=\"동작구\">동작구</option>\n
\n
                      <option value=\"광진구\">광진</option>\n
\n
                  
\n
\n
                    </select>\n
\n
                  </Form.Item>\n
\n
                  <Form.Item name=\"address3\">\n
\n
                    <select className=\"searchboxselect\">\n
\n
                      <option>동선택</option>\n
\n
                      <option value=\"역삼동\">역삼</option>\n
\n
                      <option value=\"청담\">청담</option>\n
\n
                      <option value=\"논현\">논현</option>\n
\n
                     
\n
                    </select>\n
\n
                  </Form.Item>\n
\n
                  <Form.Item name=\"address4\">\n
\n
                    <Input className=\"upload-adr4\" placeholder=\"상세주소\" />\n
\n
                  </Form.Item>\n
\n
                </div>\n
\n
                <div className=\"Detailsec\">\n
\n
                  <span className=\"checkinspan\">체크인 기간</span>\n
\n
                  <Form.Item name=\"datein\">\n
\n
                    <Input className=\"checkIn\" type=\"date\" />\n
\n
                  </Form.Item>\n
\n
                  <span> ~ </span>\n
\n
                  <Form.Item name=\"dateout\">\n
\n
                    <Input className=\"checkOut\" type=\"date\" />\n
\n
                  </Form.Item>\n
\n
                </div>\n
\n
                <div className=\"Detailsec\">\n
\n
                  <span className=\"typespan\">방 타입</span>\n
\n
                  <Form.Item name=\"roomtype\">\n
\n
                    <select className=\"typeselect\">\n
\n
                      <option>방선택</option>\n
\n
                      <option value=\"1\">1룸</option>\n
\n
                      <option value=\"2\">2룸</option>\n
\n
                      <option value=\"3\">3룸</option>\n
\n
                    </select>\n
\n
                  </Form.Item>\n
\n
                </div>\n
\n
                <div className=\"Detailsec\">\n
\n
                  <span className=\"perspan\">인원</span>\n
\n
                  <Form.Item name=\"people\">\n
\n
                    <select className=\"perselect\">\n
\n
                      <option>인원선택</option>\n
\n
                      <option value=\"1\">1명</option>\n
\n
                      <option value=\"2\">2명</option>\n
\n
                      <option value=\"3\">3명</option>\n
\n
                    </select>\n
\n
                  </Form.Item>\n
\n
                </div>\n
\n
                <div className=\"Detailsec\">\n
\n
                  <span className=\"moneyspan\">금액</span>\n
\n
                  <Form.Item name=\"price\">\n
\n
                    <InputNumber defaultValue={0className=\"upload-price\" />\n
\n
                  </Form.Item>\n
\n
                </div>\n
\n
                <div className=\"Detailsec\">\n
\n
                  <span className=\"Detailspan\">기타</span>\n
\n
                  <Form.Item name=\"description\">\n
\n
                    <Input.TextArea\n
\n
\n                      size=\"large\"\n
\n
\n                      id=\"room-description\"\n
\n
\n                      showCount\n
\n
\n                      maxLength={300}\n
\n
\n                      placeholder=\"방에 대한 추가 설명을 적어주세요.\"\n
\n
\n                    />\n
\n
                  </Form.Item>\n
\n
                </div>\n
\n
              </div>\n
\n
            </div>\n
\n
            <div className=\"button\">\n
\n
              <Form.Item>\n
\n
                <Button id=\"room-submit-button\" size=\"large\" htmlType=\"submit\">\n
\n
                  등록
\n
                </Button>\n
\n
              </Form.Item>\n
\n
            </div>\n
\n
          </Form>\n
\n
        </div>\n
\n
      </div>\n
\n
      <div id=\"footerbox\">\n
\n
        <div id=\"fo1\">\n
\n
          <span id=\"quick\">회사소개</span>\n
\n
          <span id=\"quick\">이용약관</span>\n
\n
          <span id=\"quick\">개인정보처리방침</span>\n
\n
          <span id=\"quick\">이용안내</span>\n
\n
          <span id=\"quick\">제휴문의</span>\n
\n
        </div>\n
\n
        <div id=\"fo2\">\n
\n
          주식회사 에어 고객센터 : 1588-1588 주소 : 서울특별시 강남구 청담동 782-22
\n
          
\n
        </div>\n
\n
        <div id=\"fo3\">\n
\n
          <span id=\"three\">\n
\n
            사업자등록번호 : 205-87-21547 통신판매업 신고번호 제2021-서울-0111호
\n
          </span>\n
\n
        </div>\n
\n
        <div id=\"fo4\">\n
\n
          <span id=\"four\">\n
\n
            서비스 이용문의 : 1588-1577 | 이메일 : airtrace@airtrace.com |
\n
            서비스제휴문의 : partnership@airtrace.com
\n
          </span>\n
\n
        </div>\n
\n
      </div>\n
\n
    </div>\n
\n
\n  );\n
\n
}
\n
\nexport default RoomRegisPage;\n
\n
\n
\n
node.js 서버 파일
\n

\n
\n
\n
\nconst express = require(\"express\");\n
\n
\nconst cors = require(\"cors\");\n
\n
\nconst app = express();\n
\n
\nconst models = require(\"./models\");\n
\n
\nconst port = 8090;\n
\n
\nconst multer = require(\"multer\");\n
\n
\nconst addroom = multer({\n
\n
  storage: multer.diskStorage({\n
\n
    destination: function (req, file, cb) {\n
\n
\n      cb(null, \"addroom/\"); // 이미지 저장 경로\n
\n
\n    },\n
\n
    filename: function (req, file, cb) {\n
\n
\n      cb(null, file.originalname); // 이미지 파일 이름 설정\n
\n
\n    },\n
\n
  }),\n
\n
\n});\n
\n
app.use(express.json());\n
\n
app.use(cors());\n
\n
app.use(\"/addroom\", express.static(\"addroom\"));\n
\n
app.get(\"/Rooms\", (req, res) => {\n
\n
\n  models.Rooms.findAll({\n
\n
\n    order: [[\"createdAt\", \"DESC\"]], // 방 조회 정렬 (오름차순) 로직 -> 최근에 등록한 방이 먼저 보이게끔 설정하기 위해서\n
\n
\n    attributes: [\n
\n
\n      \"id\",\n
\n
\n      \"address1\",\n
\n
\n      \"address2\",\n
\n
\n      \"address3\",\n
\n
\n      \"address4\",\n
\n
\n      \"datein\",\n
\n
\n      \"dateout\",\n
\n
\n      \"roomtype\",\n
\n
\n      \"people\",\n
\n
\n      \"description\",\n
\n
\n      \"imageurl\",\n
\n
\n    ], // 가져오고 싶은 데이터만 받아올 수 있는 로직\n
\n
\n  })\n
\n
\n    .then((result) => {\n
\n
\n      console.log(\"Rooms : \", result);\n
\n
\n      res.send({\n
\n
\n        Rooms: result,\n
\n
\n      });\n
\n
\n    })\n
\n
\n    .catch((error) => {\n
\n
\n      console.error(error);\n
\n
\n      res.status(400).send(\"에러 발생\");\n
\n
\n    });\n
\n
\n});\n
\n
app.post(\"/Rooms\", (req, res) => {\n
\n
\n  const body = req.body;\n
\n
\n  res.send({\n
\n
\n    body,\n
\n
\n  });\n
\n
\n  const {\n
\n
\n    address1,\n
\n
\n    address2,\n
\n
\n    address3,\n
\n
\n    address4,\n
\n
\n    datein,\n
\n
\n    dateout,\n
\n
\n    roomtype,\n
\n
\n    people,\n
\n
\n    price,\n
\n
\n    description,\n
\n
\n    imageurl,\n
\n
\n  } = body;\n
\n
\n  if (\n
\n
\n    // 만약 필드 중 하나라도 입력을 안 했을 경우 에러를 출력하는 로직\n
\n
\n    !address1 ||\n
\n
\n    !address2 ||\n
\n
\n    !address3 ||\n
\n
\n    !address4 ||\n
\n
\n    !datein ||\n
\n
\n    !dateout ||\n
\n
\n    !roomtype ||\n
\n
\n    !people ||\n
\n
\n    !price ||\n
\n
\n    !description ||\n
\n
\n    !imageurl
\n
\n  ) {\n
\n
\n    res.status(400).send(\"모든 필드를 입력해주세요\");\n
\n
\n  }\n
\n
\n  models.Rooms.create({\n
\n
\n    address1,\n
\n
\n    address2,\n
\n
\n    address3,\n
\n
\n    address4,\n
\n
\n    datein,\n
\n
\n    dateout,\n
\n
\n    roomtype,\n
\n
\n    people,\n
\n
\n    price,\n
\n
\n    description,\n
\n
\n    imageurl,\n
\n
\n  })\n
\n
\n    .then((result) => {\n
\n
\n      console.log(\"방 등록 결과 : \", result);\n
\n
\n      res.send({\n
\n
\n        result,\n
\n
\n      });\n
\n
\n    })\n
\n
\n    .catch((error) => {\n
\n
\n      console.error(error);\n
\n
\n      res.status(400).send(\"방 등록에 문제가 발생했습니다\");\n
\n
\n    });\n
\n
\n});\n
\n
app.get(\"/Rooms/:id\", (req, res) => {\n
\n
\n  const params = req.params;\n
\n
\n  const { id } = params;\n
\n
\n  models.Rooms.findOne({\n
\n
\n    // 방 번호 (id) 와 일치하는 정보를 불러오는 로직\n
\n
\n    where: {\n
\n
\n      id: id,\n
\n
\n    },\n
\n
\n    attributes: [\n
\n
\n      \"id\",\n
\n
\n      \"address1\",\n
\n
\n      \"address2\",\n
\n
\n      \"address3\",\n
\n
\n      \"address4\",\n
\n
\n      \"datein\",\n
\n
\n      \"dateout\",\n
\n
\n      \"roomtype\",\n
\n
\n      \"people\",\n
\n
\n      \"description\",\n
\n
\n      \"imageurl\",\n
\n
\n    ],\n
\n
\n  })\n
\n
\n    .then((result) => {\n
\n
\n      console.log(\"ROOMS : \", result);\n
\n
\n      res.send({\n
\n
\n        Rooms: result,\n
\n
\n      });\n
\n
\n    })\n
\n
\n    .catch((error) => {\n
\n
\n      console.log(error);\n
\n
\n      res.status(400).send(\"방 조회에 에러가 발생했습니다.\");\n
\n
\n    });\n
\n
\n});\n
\n
app.post(\"/image\", addroom.single(\"image\"), (req, res) => {\n
\n
\n  // 이미지 업로드 로직\n
\n
\n  const file = req.file;\n
\n
\n  console.log(file);\n
\n
\n  res.send({\n
\n
\n    imageUrl: file.path, // 파일의 경로\n
\n
\n  });\n
\n
\n});\n
\n
app.listen(port, () => {\n
\n
\n  console.log(\"airtrace 서버가 돌아가고 있습니다\");\n
\n
\n  models.sequelize
\n
\n    .sync()\n
\n
\n    .then(() => {\n
\n
\n      console.log(\"DB 연결 성공!\");\n
\n
\n    })\n
\n
\n    .catch((err) => {\n
\n
\n      console.error(err);\n
\n
\n      console.log(\"DB 연결 에러\");\n
\n
\n      process.exit();\n
\n
\n    });\n
\n
\n});\n
\n
\n
\n
필드의 정보를 담는 js파일
\n

\n
\n
\nmodule.exports = function (sequelize, DataTypes) {\n
\n
\n  const rooms = sequelize.define(\"Rooms\", {\n
\n
\n    address1: {\n
\n
\n      type: DataTypes.STRING(30),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    address2: {\n
\n
\n      type: DataTypes.STRING(30),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    address3: {\n
\n
\n      type: DataTypes.STRING(30),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    address4: {\n
\n
\n      type: DataTypes.STRING(200),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    datein: {\n
\n
\n      type: DataTypes.STRING(50),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    dateout: {\n
\n
\n      type: DataTypes.STRING(50),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    roomtype: {\n
\n
\n      type: DataTypes.STRING(10),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    people: {\n
\n
\n      type: DataTypes.STRING(15),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    price: {\n
\n
\n      type: DataTypes.INTEGER(50),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    description: {\n
\n
\n      type: DataTypes.STRING(500),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n    imageurl: {\n
\n
\n      type: DataTypes.STRING(300),\n
\n
\n      allowNull: false,\n
\n
\n    },\n
\n
\n  });\n
\n
\n  return rooms;\n
\n
};
\n
\n
\n
\n \n\n \n \n \n \n\n \n \n\n \n \n \n
', '1_1040202_387200250', ' 웹사이트를 제작하는 과정에서 리엑트와 서버를 키고 웹에서 전송 버튼을 누르면 서버 콘솔에 방 등록 결과가 찍혀야하고 DB에도 저장이 돼야 합니다 그런데 전송 버튼을 누르면 이미지에 대한 정보만 넘어오고 다른 정보가 서버로 넘어오지 않고 Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client     at ServerResponse.setHeader (_http_outgoing.js:558:11)     at ServerResponse.header (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express     at ServerResponse.send (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express\\l     at C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\server.js:82:21     at Layer.handle [as handle_request] (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modu     at next (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express\\lib\\router\\route     at Route.dispatch (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express\\lib\\ro     at Layer.handle [as handle_request] (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modu     at C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\express\\lib\\router\\index.js:28     at Function.process_params (C:\\Users\\ASROCK\\Documents\\roomsharingservice-server\\node_modules\\expre 이런 에러가 발생합니다 axios 통신은 포스트맨으로 사용을 했습니다 (포스트맨으로 임의의 값을 입력하고 넣었을 때는 디비에 잘 들어갑니다) 코드 올려봅니다 리엑트 파일 import \"./index.css\"; import axios from \"axios\"; import { useState } from \"react\"; import { Button, Divider, Form, Input, InputNumber, Upload } from \"antd\"; import { Switch, Route, Link, useHistory } from \"react-router-dom\"; import { API_URL } from \"../config/constants\"; //서버주소 API_URL Ctrl+좌클릭이동 주소수정가능 function RoomRegisPage() {      const [imageUrl, setImageUrl] = useState(null);   const onSubmit = (values) => {     console.log(values);          axios       .post(`${API_URL}/Rooms`, {         //서버통신해서 DB로 보내는것         address1: values.adr1,         address2: values.adr2,         address3: values.adr3,         address4: values.adr4,         datein: values.datein,         dateOut: values.dateout,         roomtype: values.roomtype,         people:values.people,         price: parseInt(values.price),         description: values.description,         imageurl:values.imageurl,       })       .then((result) => {         console.log(result);       }).catch(function (error){         console.error(error);       });   };   const onChangeImage = (info) => {     if (info.file.status === \"uploading\") {       return;     }     if (info.file.status === \"done\") {       const response = info.file.response;       const imageUrl = response.imageUrl;       setImageUrl(imageUrl);     }   };   return (     <div>       <div id=\"header\">         <div id=\"header-area\">           <Link to=\"/\">             <img src=\"../images/logo.png\" id=\"logo\" alt=\"logo\" />           </Link>         </div>       </div>       <div className=\"regiscontainer\">         <h1>방 등록 페이지</h1>         <div className=\"roomRegisBox\">           <Form name=\"방등록\" onFinish={onSubmit}>             <div className=\"roomDetail\">               <Form.Item name=\"upload-pic\">                 <div className=\"roomPic\">                   <Upload                     name=\"image\"                     action={`${API_URL}/image`} //이미지가 올라갈 링크                     listType=\"picture\"                     showUploadList={false}                     onChange={onChangeImage}                   >                     {imageUrl ? (                       <img                         id=\"upload-img\"                         src={`${API_URL}/${imageUrl}`} //이미지가 올라갈 링크                       />                     ) : (                       <div id=\"upload-img-placeholder\">                         <img src=\"/images/camera.png\" />                         <span>이미지를 업로드해주세요.</span>                       </div>                     )}                   </Upload>                 </div>               </Form.Item>               <div className=\"roomDetailsec\">                 <div className=\"Detailsec\">                   <span className=\"adrspan\">주소</span>                   <Form.Item name=\"address1\">                     <select className=\"searchboxselect\">                       <option>도시선택</option>                       <option value=\"서울\">서울</option>                     </select>                   </Form.Item>                   <Form.Item name=\"address2\">                     <select className=\"searchboxselect\">                       <option>구선택</option>                       <option value=\"강남구\">강남구</option>                       <option value=\"동작구\">동작구</option>                       <option value=\"광진구\">광진구</option>                                        </select>                   </Form.Item>                   <Form.Item name=\"address3\">                     <select className=\"searchboxselect\">                       <option>동선택</option>                       <option value=\"역삼동\">역삼동</option>                       <option value=\"청담동\">청담동</option>                       <option value=\"논현동\">논현동</option>                                           </select>                   </Form.Item>                   <Form.Item name=\"address4\">                     <Input className=\"upload-adr4\" placeholder=\"상세주소\" />                   </Form.Item>                 </div>                 <div className=\"Detailsec\">                   <span className=\"checkinspan\">체크인 기간</span>                   <Form.Item name=\"datein\">                     <Input className=\"checkIn\" type=\"date\" />                   </Form.Item>                   <span> ~ </span>                   <Form.Item name=\"dateout\">                     <Input className=\"checkOut\" type=\"date\" />                   </Form.Item>                 </div>                 <div className=\"Detailsec\">                   <span className=\"typespan\">방 타입</span>                   <Form.Item name=\"roomtype\">                     <select className=\"typeselect\">                       <option>방선택</option>                       <option value=\"1\">1룸</option>                       <option value=\"2\">2룸</option>                       <option value=\"3\">3룸</option>                     </select>                   </Form.Item>                 </div>                 <div className=\"Detailsec\">                   <span className=\"perspan\">인원</span>                   <Form.Item name=\"people\">                     <select className=\"perselect\">                       <option>인원선택</option>                       <option value=\"1\">1명</option>                       <option value=\"2\">2명</option>                       <option value=\"3\">3명</option>                     </select>                   </Form.Item>                 </div>                 <div className=\"Detailsec\">                   <span className=\"moneyspan\">금액</span>                   <Form.Item name=\"price\">                     <InputNumber defaultValue={0} className=\"upload-price\" />                   </Form.Item>                 </div>                 <div className=\"Detailsec\">                   <span className=\"Detailspan\">기타</span>                   <Form.Item name=\"description\">                     <Input.TextArea                       size=\"large\"                       id=\"room-description\"                       showCount                       maxLength={300}                       placeholder=\"방에 대한 추가 설명을 적어주세요.\"                     />                   </Form.Item>                 </div>               </div>             </div>             <div className=\"button\">               <Form.Item>                 <Button id=\"room-submit-button\" size=\"large\" htmlType=\"submit\">                   등록                 </Button>               </Form.Item>             </div>           </Form>         </div>       </div>       <div id=\"footerbox\">         <div id=\"fo1\">           <span id=\"quick\">회사소개</span>           <span id=\"quick\">이용약관</span>           <span id=\"quick\">개인정보처리방침</span>           <span id=\"quick\">이용안내</span>           <span id=\"quick\">제휴문의</span>         </div>         <div id=\"fo2\">           주식회사 에어 고객센터 : 1588-1588 주소 : 서울특별시 강남구 청담동 782-22                    </div>         <div id=\"fo3\">           <span id=\"three\">             사업자등록번호 : 205-87-21547 통신판매업 신고번호 제2021-서울-0111호           </span>         </div>         <div id=\"fo4\">           <span id=\"four\">             서비스 이용문의 : 1588-1577 | 이메일 : airtrace@airtrace.com |             서비스제휴문의 : partnership@airtrace.com           </span>         </div>       </div>     </div>   ); } export default RoomRegisPage; node.js 서버 파일 const express = require(\"express\"); const cors = require(\"cors\"); const app = express(); const models = require(\"./models\"); const port = 8090; const multer = require(\"multer\"); const addroom = multer({   storage: multer.diskStorage({     destination: function (req, file, cb) {       cb(null, \"addroom/\"); // 이미지 저장 경로     },     filename: function (req, file, cb) {       cb(null, file.originalname); // 이미지 파일 이름 설정     },   }), }); app.use(express.json()); app.use(cors()); app.use(\"/addroom\", express.static(\"addroom\")); app.get(\"/Rooms\", (req, res) => {   models.Rooms.findAll({     order: [[\"createdAt\", \"DESC\"]], // 방 조회 정렬 (오름차순) 로직 -> 최근에 등록한 방이 먼저 보이게끔 설정하기 위해서     attributes: [       \"id\",       \"address1\",       \"address2\",       \"address3\",       \"address4\",       \"datein\",       \"dateout\",       \"roomtype\",       \"people\",       \"description\",       \"imageurl\",     ], // 가져오고 싶은 데이터만 받아올 수 있는 로직   })     .then((result) => {       console.log(\"Rooms : \", result);       res.send({         Rooms: result,       });     })     .catch((error) => {       console.error(error);       res.status(400).send(\"에러 발생\");     }); }); app.post(\"/Rooms\", (req, res) => {   const body = req.body;   res.send({     body,   });   const {     address1,     address2,     address3,     address4,     datein,     dateout,     roomtype,     people,     price,     description,     imageurl,   } = body;   if (     // 만약 필드 중 하나라도 입력을 안 했을 경우 에러를 출력하는 로직     !address1 ||     !address2 ||     !address3 ||     !address4 ||     !datein ||     !dateout ||     !roomtype ||     !people ||     !price ||     !description ||     !imageurl   ) {     res.status(400).send(\"모든 필드를 입력해주세요\");   }   models.Rooms.create({     address1,     address2,     address3,     address4,     datein,     dateout,     roomtype,     people,     price,     description,     imageurl,   })     .then((result) => {       console.log(\"방 등록 결과 : \", result);       res.send({         result,       });     })     .catch((error) => {       console.error(error);       res.status(400).send(\"방 등록에 문제가 발생했습니다\");     }); }); app.get(\"/Rooms/:id\", (req, res) => {   const params = req.params;   const { id } = params;   models.Rooms.findOne({     // 방 번호 (id) 와 일치하는 정보를 불러오는 로직     where: {       id: id,     },     attributes: [       \"id\",       \"address1\",       \"address2\",       \"address3\",       \"address4\",       \"datein\",       \"dateout\",       \"roomtype\",       \"people\",       \"description\",       \"imageurl\",     ],   })     .then((result) => {       console.log(\"ROOMS : \", result);       res.send({         Rooms: result,       });     })     .catch((error) => {       console.log(error);       res.status(400).send(\"방 조회에 에러가 발생했습니다.\");     }); }); app.post(\"/image\", addroom.single(\"image\"), (req, res) => {   // 이미지 업로드 로직   const file = req.file;   console.log(file);   res.send({     imageUrl: file.path, // 파일의 경로   }); }); app.listen(port, () => {   console.log(\"airtrace 서버가 돌아가고 있습니다\");   models.sequelize     .sync()     .then(() => {       console.log(\"DB 연결 성공!\");     })     .catch((err) => {       console.error(err);       console.log(\"DB 연결 에러\");       process.exit();     }); }); 필드의 정보를 담는 js파일 module.exports = function (sequelize, DataTypes) {   const rooms = sequelize.define(\"Rooms\", {     address1: {       type: DataTypes.STRING(30),       allowNull: false,     },     address2: {       type: DataTypes.STRING(30),       allowNull: false,     },     address3: {       type: DataTypes.STRING(30),       allowNull: false,     },     address4: {       type: DataTypes.STRING(200),       allowNull: false,     },     datein: {       type: DataTypes.STRING(50),       allowNull: false,     },     dateout: {       type: DataTypes.STRING(50),       allowNull: false,     },     roomtype: {       type: DataTypes.STRING(10),       allowNull: false,     },     people: {       type: DataTypes.STRING(15),       allowNull: false,     },     price: {       type: DataTypes.INTEGER(50),       allowNull: false,     },     description: {       type: DataTypes.STRING(500),       allowNull: false,     },     imageurl: {       type: DataTypes.STRING(300),       allowNull: false,     },   });   return rooms; }; ', 'https://cboard.net/sitemap/og_image.php?text=node.js 오류&link=https://cboard.net/k/1_1040202_387200250', '2021.04.14')
Data too long for column 'content' at row 1 node.js 오류

node.js 오류

node.js 오류

작성일 2021.04.14댓글 1건
    게시물 수정 , 삭제는 로그인 필요

웹사이트를 제작하는 과정에서 리엑트와 서버를 키고

웹에서 전송 버튼을 누르면 서버 콘솔에 방 등록 결과가 찍혀야하고 DB에도 저장이 돼야 합니다

그런데 전송 버튼을 누르면 이미지에 대한 정보만 넘어오고 다른 정보가 서버로 넘어오지 않고

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client
    at ServerResponse.setHeader (_http_outgoing.js:558:11)
    at ServerResponse.header (C:\Users\ASROCK\Documents\roomsharingservice-server\node_modules\express
    at ServerResponse.send (C:\Users\ASROCK\Documents\roomsharingservice-server\node_modules\express\l
    at C:\Users\ASROCK\Documents\roomsharingservice-server\server.js:82:21
    at Layer.handle [as handle_request] (C:\Users\ASROCK\Documents\roomsharingservice-server\node_modu
    at next (C:\Users\ASROCK\Documents\roomsharingservice-server\node_modules\express\lib\router\route
    at Route.dispatch (C:\Users\ASROCK\Documents\roomsharingservice-server\node_modules\express\lib\ro
    at Layer.handle [as handle_request] (C:\Users\ASROCK\Documents\roomsharingservice-server\node_modu
    at C:\Users\ASROCK\Documents\roomsharingservice-server\node_modules\express\lib\router\index.js:28
    at Function.process_params (C:\Users\ASROCK\Documents\roomsharingservice-server\node_modules\expre

이런 에러가 발생합니다 axios 통신은 포스트맨으로 사용을 했습니다

(포스트맨으로 임의의 값을 입력하고 넣었을 때는 디비에 잘 들어갑니다)

코드 올려봅니다

리엑트 파일

import "./index.css";
import axios from "axios";
import { useState } from "react";
import { Button, Divider, Form, Input, InputNumber, Upload } from "antd";
import { Switch, Route, Link, useHistory } from "react-router-dom";
import { API_URL } from "../config/constants"; //서버주소 API_URL Ctrl+좌클릭이동 주소수정가능

function RoomRegisPage() {
  
  const [imageUrl, setImageUrl] = useState(null);
  const onSubmit = (values) => {
    console.log(values);
    
    axios
      .post(`${API_URL}/Rooms`, {
        //서버통신해서 DB로 보내는것
        address1: values.adr1,
        address2: values.adr2,
        address3: values.adr3,
        address4: values.adr4,
        datein: values.datein,
        dateOut: values.dateout,
        roomtype: values.roomtype,
        people:values.people,
        price: parseInt(values.price),
        description: values.description,
        imageurl:values.imageurl,
      })
      .then((result) => {
        console.log(result);
      }).catch(function (error){
        console.error(error);
      });
  };
  const onChangeImage = (info) => {
    if (info.file.status === "uploading"{
      return;
    }
    if (info.file.status === "done"{
      const response = info.file.response;
      const imageUrl = response.imageUrl;
      setImageUrl(imageUrl);
    }
  };
  return (
    <div>
      <div id="header">
        <div id="header-area">
          <Link to="/">
            <img src="../images/logo.png" id="logo" alt="logo" />
          </Link>
        </div>
      </div>
      <div className="regiscontainer">
        <h1>방 등록 페이지</h1>
        <div className="roomRegisBox">
          <Form name="방등록" onFinish={onSubmit}>
            <div className="roomDetail">
              <Form.Item name="upload-pic">
                <div className="roomPic">
                  <Upload
                    name="image"
                    action={`${API_URL}/image`//이미지가 올라갈 링크
                    listType="picture"
                    showUploadList={false}
                    onChange={onChangeImage}
                  >
                    {imageUrl ? (
                      <img
                        id="upload-img"
                        src={`${API_URL}/${imageUrl}`//이미지가 올라갈 링크
                      />
                    ) : (
                      <div id="upload-img-placeholder">
                        <img src="/images/camera.png" />
                        <span>이미지를 업로드해주세요.</span>
                      </div>
                    )}
                  </Upload>
                </div>
              </Form.Item>
              <div className="roomDetailsec">
                <div className="Detailsec">
                  <span className="adrspan">주소</span>
                  <Form.Item name="address1">
                    <select className="searchboxselect">
                      <option>도시선택</option>
                      <option value="서울">서울</option>
                    </select>
                  </Form.Item>
                  <Form.Item name="address2">
                    <select className="searchboxselect">
                      <option>구선택</option>
                      <option value="강남구">강남</option>
                      <option value="동작구">동작구</option>
                      <option value="광진구">광진</option>
                  
                    </select>
                  </Form.Item>
                  <Form.Item name="address3">
                    <select className="searchboxselect">
                      <option>동선택</option>
                      <option value="역삼동">역삼</option>
                      <option value="청담">청담</option>
                      <option value="논현">논현</option>
                     
                    </select>
                  </Form.Item>
                  <Form.Item name="address4">
                    <Input className="upload-adr4" placeholder="상세주소" />
                  </Form.Item>
                </div>
                <div className="Detailsec">
                  <span className="checkinspan">체크인 기간</span>
                  <Form.Item name="datein">
                    <Input className="checkIn" type="date" />
                  </Form.Item>
                  <span> ~ </span>
                  <Form.Item name="dateout">
                    <Input className="checkOut" type="date" />
                  </Form.Item>
                </div>
                <div className="Detailsec">
                  <span className="typespan">방 타입</span>
                  <Form.Item name="roomtype">
                    <select className="typeselect">
                      <option>방선택</option>
                      <option value="1">1룸</option>
                      <option value="2">2룸</option>
                      <option value="3">3룸</option>
                    </select>
                  </Form.Item>
                </div>
                <div className="Detailsec">
                  <span className="perspan">인원</span>
                  <Form.Item name="people">
                    <select className="perselect">
                      <option>인원선택</option>
                      <option value="1">1명</option>
                      <option value="2">2명</option>
                      <option value="3">3명</option>
                    </select>
                  </Form.Item>
                </div>
                <div className="Detailsec">
                  <span className="moneyspan">금액</span>
                  <Form.Item name="price">
                    <InputNumber defaultValue={0className="upload-price" />
                  </Form.Item>
                </div>
                <div className="Detailsec">
                  <span className="Detailspan">기타</span>
                  <Form.Item name="description">
                    <Input.TextArea
                      size="large"
                      id="room-description"
                      showCount
                      maxLength={300}
                      placeholder="방에 대한 추가 설명을 적어주세요."
                    />
                  </Form.Item>
                </div>
              </div>
            </div>
            <div className="button">
              <Form.Item>
                <Button id="room-submit-button" size="large" htmlType="submit">
                  등록
                </Button>
              </Form.Item>
            </div>
          </Form>
        </div>
      </div>
      <div id="footerbox">
        <div id="fo1">
          <span id="quick">회사소개</span>
          <span id="quick">이용약관</span>
          <span id="quick">개인정보처리방침</span>
          <span id="quick">이용안내</span>
          <span id="quick">제휴문의</span>
        </div>
        <div id="fo2">
          주식회사 에어 고객센터 : 1588-1588 주소 : 서울특별시 강남구 청담동 782-22
          
        </div>
        <div id="fo3">
          <span id="three">
            사업자등록번호 : 205-87-21547 통신판매업 신고번호 제2021-서울-0111호
          </span>
        </div>
        <div id="fo4">
          <span id="four">
            서비스 이용문의 : 1588-1577 | 이메일 : airtrace@airtrace.com |
            서비스제휴문의 : partnership@airtrace.com
          </span>
        </div>
      </div>
    </div>
  );
}
export default RoomRegisPage;

node.js 서버 파일

const express = require("express");
const cors = require("cors");
const app = express();
const models = require("./models");
const port = 8090;
const multer = require("multer");
const addroom = multer({
  storage: multer.diskStorage({
    destination: function (req, file, cb) {
      cb(null, "addroom/"); // 이미지 저장 경로
    },
    filename: function (req, file, cb) {
      cb(null, file.originalname); // 이미지 파일 이름 설정
    },
  }),
});
app.use(express.json());
app.use(cors());
app.use("/addroom", express.static("addroom"));

app.get("/Rooms", (req, res) => {
  models.Rooms.findAll({
    order: [["createdAt", "DESC"]], // 방 조회 정렬 (오름차순) 로직 -> 최근에 등록한 방이 먼저 보이게끔 설정하기 위해서
    attributes: [
      "id",
      "address1",
      "address2",
      "address3",
      "address4",
      "datein",
      "dateout",
      "roomtype",
      "people",
      "description",
      "imageurl",
    ], // 가져오고 싶은 데이터만 받아올 수 있는 로직
  })
    .then((result) => {
      console.log("Rooms : ", result);
      res.send({
        Rooms: result,
      });
    })
    .catch((error) => {
      console.error(error);
      res.status(400).send("에러 발생");
    });
});

app.post("/Rooms", (req, res) => {
  const body = req.body;
  res.send({
    body,
  });
  const {
    address1,
    address2,
    address3,
    address4,
    datein,
    dateout,
    roomtype,
    people,
    price,
    description,
    imageurl,
  } = body;
  if (
    // 만약 필드 중 하나라도 입력을 안 했을 경우 에러를 출력하는 로직
    !address1 ||
    !address2 ||
    !address3 ||
    !address4 ||
    !datein ||
    !dateout ||
    !roomtype ||
    !people ||
    !price ||
    !description ||
    !imageurl
  ) {
    res.status(400).send("모든 필드를 입력해주세요");
  }
  models.Rooms.create({
    address1,
    address2,
    address3,
    address4,
    datein,
    dateout,
    roomtype,
    people,
    price,
    description,
    imageurl,
  })
    .then((result) => {
      console.log("방 등록 결과 : ", result);
      res.send({
        result,
      });
    })
    .catch((error) => {
      console.error(error);
      res.status(400).send("방 등록에 문제가 발생했습니다");
    });
});

app.get("/Rooms/:id", (req, res) => {
  const params = req.params;
  const { id } = params;
  models.Rooms.findOne({
    // 방 번호 (id) 와 일치하는 정보를 불러오는 로직
    where: {
      id: id,
    },
    attributes: [
      "id",
      "address1",
      "address2",
      "address3",
      "address4",
      "datein",
      "dateout",
      "roomtype",
      "people",
      "description",
      "imageurl",
    ],
  })
    .then((result) => {
      console.log("ROOMS : ", result);
      res.send({
        Rooms: result,
      });
    })
    .catch((error) => {
      console.log(error);
      res.status(400).send("방 조회에 에러가 발생했습니다.");
    });
});

app.post("/image", addroom.single("image"), (req, res) => {
  // 이미지 업로드 로직
  const file = req.file;
  console.log(file);
  res.send({
    imageUrl: file.path, // 파일의 경로
  });
});

app.listen(port, () => {
  console.log("airtrace 서버가 돌아가고 있습니다");
  models.sequelize
    .sync()
    .then(() => {
      console.log("DB 연결 성공!");
    })
    .catch((err) => {
      console.error(err);
      console.log("DB 연결 에러");
      process.exit();
    });
});

필드의 정보를 담는 js파일

module.exports = function (sequelize, DataTypes) {
  const rooms = sequelize.define("Rooms", {
    address1: {
      type: DataTypes.STRING(30),
      allowNull: false,
    },
    address2: {
      type: DataTypes.STRING(30),
      allowNull: false,
    },
    address3: {
      type: DataTypes.STRING(30),
      allowNull: false,
    },
    address4: {
      type: DataTypes.STRING(200),
      allowNull: false,
    },
    datein: {
      type: DataTypes.STRING(50),
      allowNull: false,
    },
    dateout: {
      type: DataTypes.STRING(50),
      allowNull: false,
    },
    roomtype: {
      type: DataTypes.STRING(10),
      allowNull: false,
    },
    people: {
      type: DataTypes.STRING(15),
      allowNull: false,
    },
    price: {
      type: DataTypes.INTEGER(50),
      allowNull: false,
    },
    description: {
      type: DataTypes.STRING(500),
      allowNull: false,
    },
    imageurl: {
      type: DataTypes.STRING(300),
      allowNull: false,
    },
  });
  return rooms;
};


#node.js 오류

profile_image 익명 작성일 -

app.post("/Rooms", (req, res) => { const body = req.body; res.send({ body, });

body를 다시 응답하는 이유가 뭔가요? 일반적으로 res를 중복해서 보낼 때 생기는 오류입니다.

response가 두번이상 된거니 한 번 확인해 보시길 바랍니다.

node.js 오류 질문드려요.

... log(`Example app listening at http://localhost:${port}`) }) 노드js 공부하는... ㅠㅠ 위에 오류는 auth 미들웨어가 빠져서 발생하는 오류이빈다....

node.js hello world출력오류???

... 어딘가에 저 내용이 있는게 아닌가 싶네요. Node.js를 바로 실행해서 콘솔 로그만 찍는다면 오류가 발생할 일이 없습니다.

초보 node.js 오류

버전확인을 위해 node -v 입력하였더니 해당오류가 출력되어 https://blog.naver.com/glasseo/221863224298확인후 사진처럼 입력했는데도 잘안되네요 해결방법 좀 알...

node.js 오류

... node.js 서버 파일 const express = require("express"); const cors = require... 일반적으로 res를 중복해서 보낼 때 생기는 오류입니다....

node js 웹서버 오류

server.js 파일을 잠시 다른 데에 옮겼다가 제자리에 돌려놨는데도 오류가 떠요..... 꺼주세요 nodemon server.js 혹은 node server.js 실행한 터미널창으로 가셔서 ctr+c