Node.jsを使用してMySQLを処理



今日、node.教科書で、実際に最も役に立つ例を持ってきました!!
特に何も考えずに友達の名前を入れましたが、データベースを作るのがおっくうなので、写真を隠して入れるつもりです.
でも書き終わってから感じたんだけど、もしそうなら、とっくに知っていたからやったんだ.

Node.jsにMySQLを入力


sequelize

node.jsは、sequelizeを介してmySQLに接続されている.sequelize公式ドキュメント

単純なデータベース構造を実行する例の可視化


結果


ユーザー登録

コメントの表示/作成/変更/削除
申し訳ありませんが、あなたの名前を隠したくありません.

実際のデータベースに反映される内容

コード解析


フォルダ構造



まず、フォルダ構造は以下のようになります.
ここで、viewsフォルダにはスクリーンを飾るための要素が含まれており、説明では省略する.データベース連動に使用する部分を簡略化したいだけです.
すべてのコードは、入口リンクとして下部に配置されます.

app.js

const {sequelize} = require('./models');

...

sequelize.sync({force:false})
  .then(()=>{
    console.log('데이터베이스 연결 성공');
  })
  .catch((err)=>{
    console.error(err);
  });

/* middle ware */
...

app.use((err, req, res, next) => {
  res.locals.message = err.message;
  res.locals.error = process.env.NODE_ENV === 'development' ? err : {}; //config 파일과 동일해야 함
  res.status(err.status || 500);
  res.render('error');
});
sequelize.sync(...):市場品質でmySQLに接続されている部分.app.use(...):ミドルウェア比較構成で指定したデータベース名(実際のMySQLで宣言した名前とは異なる)を使用します.
では、プロファイルを見ないわけにはいかないでしょう.

config.json


これは私がずっと感じていたもので、jsonにも注釈をつけてほしいのですが...
{
  "development": {
    "username": "root",
    "password": "1234", 
    "database": "nodejs",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
 ...
}
"development" : app.jsにはこの名前が含まれている必要があります.どちらかが違うなら統一すればいい."username":ルートにデータベース構造を作成し、ルートに書き込みます."password":私はパスワードを1234に設定し、パスワードを" "に設定しないので、運転中にエラーが発生したので大変でした.🎃 必ず引用符で囲んでください."database":このセクションには、データベース構造のスキーマ名が含まれています.

models/users.js


モデル構造に定義された部分.モデルはテーブルを表します.
const Sequelize = require('sequelize');

module.exports = class User extends Sequelize.Model{
    static init(sequelize){
        return super.init({
            name:{
                type:Sequelize.STRING(20),
                allowNull:false,
                unique:true,
			...
              
            },
        }, {
            sequelize,
            timestamps:false,
            underscored:false,
            modelName:'User',
            tableName:'users',  //mySQL 테이블 명 들어가는 곳
            paranoid:false,
            charset:'utf8',
            collate:'utf8_general_ci',
        });

    }
    //관계설정 1:N = USER : COMMENT
    static associate(db) {
        //hasMany : 현재 모델의 정보가 다른 모델로 들어갈 때
        db.User.hasMany(db.Comment,{foreignKey:'commenter',sourceKey:'id'});
    }
};
init:ここでは、最初に作成したmySQLデータベース構造と同じ内容でなければなりません.associate:テーブル間の関係が確立されている場合は、テーブルに入る必要があります.内容はコメントと同じです.照会が読める人なら、多分説明できると思います.db.Commentはモデル/注釈です.jsはexportsです.

models/comments.js

const Sequelize = require('sequelize');

module.exports = class Comment extends Sequelize.Model {
    static init(sequelize) {
        return super.init({
            comment:{
                type:Sequelize.STRING(30),
                allowNull:false,
            },
            created_at:{
                type:Sequelize.DATE,
                allowNull:true,
                defaultValue:Sequelize.NOW,
            },
        },{
            sequelize,
            timestamps:false,
            modelName:'Comment',
            tableName:'comments',    //mySQL 테이블 명 들어가는 곳
            paranoid:false,
            cherset:'utf8mb4',
            collate:'utf8mb4_general_ci',
        });
    }
    //관계설정 1:N = USER : COMMENT
    static associate(db){
        //belongsTo:현재 모델에서 다른 모델의 정보를 받아올 때 == 다른 모델의 정보가 들어갈 때
        db.Comment.belongsTo(db.User,{foreignKey:'commenter',targetKey:'id'});
    }
}

同様に、属性はinitで定義され、associateには先ほどとは異なる方法が含まれています.

Nodejsアーキテクチャのテーブルは、usersとcommentsの2つです.
この2つのテーブルは1:Nの構造なので、hasManybelongsToの方法を使用しています.
他の関係では、メソッド名が少し異なります.(表にまとめる)
提供する方法1:NhasManybelongsTo 1:1 hasOnebelongston:MbelongsToManyLongsToMany
そしてN:M構造は、新しいモデル(テーブル)を作成します.なぜか分からないが、教授がそうすれば{ through : 'tablename'}が提供する、提供されるモデルのbelongsToManyの後ろに貼ればよい.

models/index.js

sequelize-cliによって自動的に生成されたコードのうち、削除および修正された部分コード.
知らないところが多い.
const Sequelize = require('sequelize');
const User = require('./user'); 
const Comment = require('./comment')
const env = process.env.NODE_ENV || 'development';
const config = require(__dirname + '/../config/config')[env];
const db = {};


const sequelize = new Sequelize(config.database, config.username, config.password, config);


db.sequelize = sequelize; 
db.User = User;
db.Comment = Comment;

/* init : 이게 있어야 테이블이 모델이 됨 */
User.init(sequelize);  
Comment.init(sequelize);

/* associate : 모델간 관계 연결 */
User.associate(db);
Comment.associate(db);

module.exports = db;
new Sequelize(..)でMySQLと関連オブジェクトを作成しました.dbオブジェクトには、ユーザおよびCommentモデル、および後に再使用に使用される続編が含まれる.

routes/index.js


ルーティング・セクション.ルーティングは、naver/com/何を「アドレス」ウィンドウに表示するか/このように表示する/./間の文字列と送信方法による変更を制御します.
var express = require('express');
const { User } = require('../models');
var router = express.Router();

/* GET home page. */
router.get('/', async (req, res, next) => {
  try{
    const users = await User.findAll();
    res.render('sequelize', { users });
  } catch(err){
    console.error(err);
    next(err);
  }
});

module.exports = router;
既定では、[品質](Quality)は[基本情報](Basic Info)オブジェクトをサポートします.したがって、クエリーの成功/失敗時の情報は、「基本情報」ルートからのasync/awaitを使用してそれぞれ取得できます.User.findAll():すべてのユーザーを検索res.render(..):データベースクエリ後のテンプレートレンダリング用

routes/users.js

const express = require('express');
const User = require('../models/user');
const Comment = require('../models/comment');

const router = express.Router();

router.route('/')
  .get(async (req, res, next) => {
    try {
      const users = await User.findAll();
      res.json(users);
    } catch (err) {
      console.error(err);
      next(err);
    }
  })
  .post(async (req, res, next) => {
    try {
      const user = await User.create({
        name: req.body.name,
        age: req.body.age,
        married: req.body.married,
      });
      console.log(user);
      res.status(201).json(user);
    } catch (err) {
      console.error(err);
      next(err);
    }
  });

router.get('/:id/comments', async (req, res, next) => {
  try {
    const comments = await Comment.findAll({
      include: {
        model: User,
        where: { id: req.params.id },
      },
    });
    console.log(comments);
    res.json(comments);
  } catch (err) {
    console.error(err);
    next(err);
  }
});

module.exports = router;
route('/'):getメソッドかpostメソッドかによって、動作が異なります.getは出力postが入力でコードを表示すると思います.定義は正確ではありませんが、すぐに理解しやすいです.res.json(..):さっきとは異なり、json形式で結果を要求します.include:内部結合用.私たちは目が利く人なので、クエリーモデルUserid: req.params.id人、commentたちです.実はよくわかりません私はどうしても公式文書が見つからない.休む.

routes/comments.js

const express = require('express');
const { Comment } = require('../models');

const router = express.Router();

router.post('/', async (req, res, next) => {
  try {
    const comment = await Comment.create({
      commenter: req.body.id,
      comment: req.body.comment,
    });
    console.log(comment);
    res.status(201).json(comment);
  } catch (err) {
    console.error(err);
    next(err);
  }
});

router.route('/:id')
  .patch(async (req, res, next) => {
    try {
      const result = await Comment.update({
        comment: req.body.comment,
      }, {
        where: { id: req.params.id },
      });
      res.json(result);
    } catch (err) {
      console.error(err);
      next(err);
    }
  })
  .delete(async (req, res, next) => {
    try {
      const result = await Comment.destroy({ where: { id: req.params.id } });
      res.json(result);
    } catch (err) {
      console.error(err);
      next(err);
    }
  });

module.exports = router;
.patch:一部のリソースのhttpメソッドのみを変更します.コメントの修正部分に対応します..delete:リソースを削除する方法.コメント部分の削除に対応します.res.status(201):201はhttpステータスコードである.これは完全に成功したという意味です.これも整理したほうがいいと思います.
httpステータスコードは、応答中にクライアントから送信されたリクエストの処理ステータスを通知することができる.
サーバが要求を実行できません5 xx(サーバエラー)サーバが正常な要求を処理できません
あの有名な404 NOT FOUNDがこれ…!
すべてのコードはここです。で提供されます.
もし私の解釈が間違っていたらぜひ教えてください!!
ベルの音は何と言うか今3時46分・・・・・・・・・・・・周りの新生人類は私にもっと意志を持たせた.頑張れ自分で...