인프런 커뮤니티 질문&답변

jay kang님의 프로필 이미지

작성한 질문수

[코드캠프] 부트캠프에서 만든 고농축 백엔드 코스

몽구스 객체값 저장하기

해결된 질문

작성

·

462

·

수정됨

0

스크린샷 2023-08-03 17.33.39.png

cheerio로 가져온값을 객체로 만든다음 밖으로 보내서 최종적으로 몽구스로 저장하고싶은데

문제가 생겼던게 저상태로 보내면 [object:object] 로 나오므로 JSON.stringfy()작업으로 문자열 형태로 내보내 주었습니다. 하지만 schema부분을 object로 하여도 object가 가장 상위의 데이터 타입으로 string형태로 저장된다고 여겨졌습니다. 그래서 JSON.stringfy()로 빼내고 저장하는 부분에서 JSON.parse로 하여 다시 저장할려 했지만 다시 [object:object]로 나와서 이부분을 어떻게 해결해야할지 잘찾아봐도 모르겠어서 질문 남겼습니다.

// siteInfo.js
import axios from "axios";
import cheerio from "cheerio";

export class SiteInfo {
  siteInfo = async (prefer) => {
    console.log(prefer);
    const siteData = await axios
      .get(prefer)
      .then()
      .catch((err) => {
        console.log("서버 데이터 안받아와짐 오류 : " + err);
      });
    const keys = [];
    const values = [];
    const $ = cheerio.load(siteData.data);
    $("meta").each((index, el) => {
      if (
        $(el).attr("property") &&
        ($(el).attr("property").includes("og:title") ||
          $(el).attr("property").includes("og:description") ||
          $(el).attr("property").includes("og:image"))
      ) {
        const content = $(el).attr("content");
        const title = $(el).attr("property");
        keys.push(title);
        values.push(content);
      }
    });
    const arr = [];

    for (let i = 0; i < keys.length; i++) {
      arr.push({
        [keys[i]]: values[i],
      });
    }
    console.log("여기 테스트 : " + arr);

    return arr;
  };
}


// signup.controller.js

export class SignupController {
  siteInfoService;
  isValueService;
  saveDataService;
  emailService;

  constructor(siteInfoService, isValueService, saveDataService, emailService) {
    this.siteInfoService = siteInfoService;
    this.isValueService = isValueService;
    this.saveDataService = saveDataService;
    this.emailService = emailService;
  }

  singUp = async (req, res) => {
    const name = req.body.name;
    const email = req.body.email;
    const personal = req.body.personal;
    const prefer = req.body.prefer;
    const pwd = req.body.pwd;
    const phone = req.body.phone;
    console.log(req.body);
    const hasValue = this.isValueService.checkToken(phone);

    if (hasValue === false) {
      res.json("isAuth값이 false입니다");
    }
    const siteInfo = await this.siteInfoService.siteInfo(prefer);
    const ttt = JSON.parse(siteInfo);
    console.log("여기 문제 발생 : " + typeof ttt);
    console.dir("여기 문제 발생 22222: " + ttt);

    const dataSave = await this.saveDataService.dataSave({
      name,
      email,
      personal,
      prefer,
      pwd,
      phone,
      siteInfo,
    });
    const isValue = this.emailService.checkMail(email);
    if (isValue === false) {
      res.send("이메일 형식이 잘못되었습니다");
    }
    const template = this.emailService.welcomeMessage({ name, phone, prefer });

    this.emailService.sendTemplateToEmail({
      template,
      email,
    });
    res.send("_id : " + dataSave);
  };

  userSearch = async (req, res) => {
    const searchReault = await this.saveDataService.dataSearch();
    console.log(searchReault);
    res.send(searchReault);
  };
}



// index.js

import express from "express";
import mongoose from "mongoose";
import cors from "cors";
// import { Token, User } from "./mvc/model/schema.model.js";

import { TokenController } from "./mvc/controller/token.controller.js";
import { SignupController } from "./mvc/controller/signup.controller.js";

// 사이트 정보 가져오기
import { SiteInfo } from "./mvc/controller/service/siteInfo.js";
// 핸드폰 정보 맞는지 boolean으로
import { CheckToken } from "./mvc/controller/service/token.js";
// db저장하고 리턴값 가져오기
import { UserDb } from "./mvc/controller/service/userDb.js";
// 이메일 확인하고 보내주기
import { EmailService } from "./mvc/controller/service/email.js";
// 핸드폰 문자 보내기
import { PhoneService } from "./mvc/controller/service/phone.js";

const app = express();
const corsOptions = {
  origin: "http://127.0.0.1:5500",
};
app.use(cors(corsOptions));
const siteInfo = new SiteInfo();
const checkToken = new CheckToken();
const userDb = new UserDb();
const emailService = new EmailService();
const phoneService = new PhoneService();

app.use(express.json());

const signUpController = new SignupController(
  siteInfo,
  checkToken,
  userDb,
  emailService
);

app.post("/users", signUpController.singUp);

app.get("/users", signUpController.userSearch);

const tokenController = new TokenController(phoneService, checkToken);

app.post("/tokens/phone", tokenController.insertdata);

app.patch("/tokens/phone", tokenController.checkToken);

mongoose.set("debug", true);

mongoose
  .connect("mongodb://mongodb-file:27017/dockerconnetor")
  .then(() => {
    console.log("connect success");
  })
  .catch(() => {
    console.log("fail to connect with db");
  });

app.listen(3001, () => {
  console.log("server open");
});

// userDb.js

import { User } from "../../model/schema.model.js";
export class UserDb {
  dataSave = async ({
    name,
    email,
    personal,
    prefer,
    pwd,
    phone,
    siteInfo,
  }) => {
    const siteInforesult = JSON.parse(siteInfo);
    console.log("여기 확인 : " + siteInforesult);
    const data = new User({
      name: name,
      email: email,
      personal: personal,
      prefer: prefer,
      pwd: pwd,
      phone: phone,
      siteInfo: siteInfo,
    });
    await data.save();
    const idData = await User.findOne({ phone: phone }, { _id: 1 }).exec();
    return idData._id;
  };

  dataSearch = async (name) => {
    console.log("start datasearch");
    const result = await User.find().exec();
    return result;
  };
}


// schema.model.js

import mongoose from "mongoose";

const tokenSchema = new mongoose.Schema({
  phone: String,
  token: Number,
  isAuth: Boolean,
});

export const Token = mongoose.model("Token", tokenSchema);

const userSchema = new mongoose.Schema({
  name: String,
  email: String,
  personal: String,
  prefer: String,
  pwd: String,
  phone: String,
  siteInfo: {
    title: String,
    content: String,
    image: String,
  },
});

export const User = mongoose.model("User", userSchema);

 

 

답변 1

0

jay kang님의 프로필 이미지
jay kang
질문자

해당 부분에서 each함수를 배열로 집어넣어 마지막에 db에 저장할때 각key에 해당 배열을 집어넣은것으로 문제는 해결했지만 실제로 다른사이트에서 받아올때 배열순서가 항상 같은곳에 같은값이 들어갈거라는 보장이 없으므로 이부분의 이슈를 해결하지 못했습니다.

노원두님의 프로필 이미지
노원두
지식공유자

안녕하세요! daon님!
코드를 보니, 점점 발전하고 계신게 확실히 보여서 보기 좋네요!^^

해당 코드상에서의 문제는 사실 없습니다!
단지, console.log를 잘 못 찍고 계셔서 이상하게 나오고 있는 것 뿐이에요!

console.log("여기테스트: " + arr) 

문자열과 arr 배열을 더하려다 보니, 더할 수 없어서 [Object:Object] 이런식으로 나온 것 뿐이랍니다.

아래와 같이 콘솔을 변경해 보세요!^^

console.log("여기테스트: ", arr) 

 

열심히 하시는 것 같아 추가 도움을 드리자면, 특정 행위를 반복하기 위해 가장 기초적으로 for문을 배우게 됩니다!
하지만, 이는 어디까지나 기초를 다루기 위함이며, 실무에서는 코드 가독성이 더 좋은 map 또는 forEach 등을 선호하게 됩니다. 따라서, 리팩토링 해보시면 좋을 것 같아요!
(성능은 for가 더 빠르지만, 계산서비스가 아니라면 가독성을 더 우선시 합니다!)

// 변경 전
const arr = []
for (let i = 0; i < keys.length; i++) {
  arr.push({
    [keys[i]]: values[i],
  });
}

// 변경 후
const arr = keys.map((key, i) => ({ [key]: values[i] }));
jay kang님의 프로필 이미지

작성한 질문수

질문하기