• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    해결됨

Field 'content' doesn't have a default value

20.03.09 18:33 작성 조회수 455

0

강의를토대로 게시판 작성을 실습중인데요! ㅠ ㅠ

게시판 작성을 누르면 "Field 'content' doesn't have a default value"라는 에러가 발생합니다.

검색해보니 mysql 특정 버전에서는 디폴트값이 없으면 에러가 날수있다고해서  마이그레이션을 작성해주었습니다.

"use strict";

module.exports = {
  up: (queryInterfaceSequelize=> {
    queryInterface.changeColumn("Posts""content", {
      type: DataTypes.TEXT,
      allowNull: false,
      defaultValue: ""
    });
  },

  down: (queryInterfaceSequelize=> {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.dropTable('users');
    */
  }
};

명령프로세서에서 실행해주면 다음과 같이 나옵니다.

 강의와 똑같은 환경과 비슷한 코드를 작성했는데 왜 에러가 나는걸까요??..

postForm.js

import React, { useCallbackuseStateuseEffect } from "react";
import styled from "styled-components";
import Link from "next/link";
import { useSelectoruseDispatch } from "react-redux";
import { media } from "../components/StyleUtils";
import { ADD_POST_REQUEST } from "../reducers/post";

const postForm = () => {
  const dispatch = useDispatch();
  const [titleTextsetTitleText] = useState();
  const [textsetText] = useState();
  const { imagePathsisAddingPostpostAdded } = useSelector(
    state => state.post
  );

  const onSubmitForm = useCallback(
    e => {
      e.preventDefault();
      if (!titleText || !titleText.trim()) {
        return alert("제목을 작성하세요.");
      }
      if (!text || !text.trim()) {
        return alert("게시글을 작성하세요.");
      }

      dispatch({
        type: ADD_POST_REQUEST,
        data: {
          title: titleText.trim(),
          content: text.trim()
        }
      });
    },
    [titleTexttext]
  );

  const onChangeTitleText = useCallback(e => {
    setTitleText(e.target.value);
  }, []);

  const onChangeText = useCallback(e => {
    setText(e.target.value);
  }, []);

  return (
    <Container>
      <PageTitle>게시글 작성</PageTitle>
      <Form onSubmit={onSubmitForm} enctype="multipart/form-data">
        <Label htmlFor="title">제목</Label>
        <Title
          id="title"
          placeholder="제목을 입력해주세요"
          value={titleText}
          onChange={onChangeTitleText}
        />

        <Label htmlFor="content">내용</Label>
        <Content
          id="content"
          placeholder="내용을 입력해주세요"
          value={text}
          onChange={onChangeText}
        />
        <ButtonBox>
          <Button type="primary" htmlType="submit" style={marginRight: 10 }}>
            작성하기
          </Button>
          <Link href="/board">
            <a>
              <ButtonSecond>목록으로</ButtonSecond>
            </a>
          </Link>
        </ButtonBox>
      </Form>
    </Container>
  );
};

export default postForm;

models => post

module.exports = (sequelizeDataTypes=> {
  const Post = sequelize.define(
    "Post"// 테이블명은 posts
    {
      title: {
        type: DataTypes.STRING(20),
        allowNull: false
      }
    },
    {
      views: {
        type: DataTypes.INTEGER,
        allowNull: false,
        defaultValue: 0
      }
    },
    {
      content: {
        type: DataTypes.TEXT// 매우 긴 글
        allowNull: false,
        defaultValue: ""
      }
    },
    {
      charset: "utf8mb4"//  한글+이모티콘
      collate: "utf8mb4_general_ci"
    }
  );
  Post.associate = db => {
    db.Post.belongsTo(db.User); // 테이블에 UserId 컬럼이 생겨요
    db.Post.hasMany(db.Comment);
    db.Post.hasMany(db.Image);
    db.Post.belongsToMany(db.User, { through: "Like"as: "Likers" });
  };
  return Post;
};

routes=>post.js

const express = require("express");
const db = require("../models");

const router = express.Router();

router.post("/"async (reqresnext=> {
  try {
    const newPost = await db.Post.create({
      title: req.body.title,
      content: req.body.content,
      UserId: req.user.id
    });
    return res.json(newPost);
  } catch (e) {
    console.error(e);
    next(e);
  }
});

router.post("/images", (reqres=> {});

router.get("/:id/comments"async (reqresnext=> {});

module.exports = router;

.

답변 6

·

답변을 작성해보세요.

1

네 마이그레이션 끝에는 항상 return 붙이셔야 합니다.

1

그냥 테이블 싹다 삭제하고 다시 만들어버릴까요?.. 실무에서는 추천하지않는 방식이라고 하셨었는데 지금은 실무가아니니깐요ㅠ.

0

"use strict";

module.exports = {
  up: function(queryInterfaceSequelize) {
    return queryInterface.changeColumn("Posts""content", {
      type: Sequelize.TEXT,
      allowNull: false,
      defaultValue: ""
    });
  },

  down: (queryInterfaceSequelize=> {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.dropTable('users');
    */
  }
};

.해결했습니다.

제가 한 실수는 다음과 같았어요

1. type 실수 (Sequelize를 DataTypes라고적었었음)

2. 에로우 펑션을 사용한것..

2번은 정확한건아닌데 function으로 고치고 return을 써주고 하니 잘 되네요

여기에 질문 안달았으면 데이터타입 다르게쓴거조차 찾지못했을껀데 감사합니다!

0

쌤 혹시 계신가요?

제 실수였네요, 데이터타입을 type: Sequelize.TEXT 로 정정했습니다. 그런데 이번엔

Migration 20200309075630-unnamed-migration.js (or wrapper) didn't return a promise 라는 에러 문구가뜹니다 ㅠ

후.. 구글링해서 npm install -g vapid-cli 도 설치해봤지만 여전히 그대로입니다. 다음은 제 마이그레이션입니다

"use strict";

module.exports = {
  up: (queryInterfaceSequelize=> {
    queryInterface.changeColumn("Posts""content", {
      type: Sequelize.TEXT,
      allowNull: false,
      defaultValue: ""
    });
  },

  down: (queryInterfaceSequelize=> {
    /*
      Add reverting commands here.
      Return a promise to correctly handle asynchronicity.

      Example:
      return queryInterface.dropTable('users');
    */
  }
};

0

일단 unnamed-migration 파일을 보시면 DataTypes를 변수가 선언이 안 되어있습니다. 매개변수쪽을 확인해보세요.

0

+  에러는나지만 리퀘스트 페이로드를 살펴보면 데이터는 잘 들어가는것 같습니다.