inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

몽구스 객체값 저장하기

해결된 질문

565

jay kang

작성한 질문수 10

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

 

 

javascript node.js express docker tdd rest-api nestjs

답변 1

0

jay kang

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

0

노원두

안녕하세요! 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] }));

그래프 ql 문서 사용할때 느낌표 남는거 어떻게 없애나요?

0

82

2

강의 전체 소스 코드를 받고싶습니다.

0

75

2

fontawesome 사용 문의

0

76

2

소스 코드 부탁드립니다~

0

85

2

깃 레포지터리 소스

0

80

2

커리큘럼12.css 정렬 에 나오는 과제 정답알고싶어요

0

72

2

10-01 Entity TypeOrmModule.forRoot 에 entities

0

84

3

강의 버전관련 문의입니다

0

102

2

Ubuntu 설치 관련

0

60

1

schema.gql 질문 드립니다.

0

50

1

서버 재실행시 Many to Many

0

100

3

input 관련 문의

0

89

2

Rest API 보다는 graphql이 주된 내용인데

0

130

2

강의 전체 소스코드 받을수있을까요?

0

154

1

도커볼륨 마운트 관련

0

126

2

findOne 타입스크립트오류

0

108

1

http => htrtps 호출 인증서 신뢰 오류

0

348

1

self-signed certificate in certificate chain 에러 발생

0

410

1

mongoose 설치 오류

0

141

1

특정 API, 특정 IP 허용 (단일경로에 CORS 활성화)

0

280

2

08-06

0

177

3

구조랑 패턴 관련해서 질문

0

124

2

mydocker

0

128

2

coolsms statuscode 2000 인데 전송안돼는 경우 확인.

0

156

1