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の構造なので、hasMany
とbelongsTo
の方法を使用しています.
他の関係では、メソッド名が少し異なります.(表にまとめる)
提供する方法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
:内部結合用.私たちは目が利く人なので、クエリーモデルUser
のid: 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分・・・・・・・・・・・・周りの新生人類は私にもっと意志を持たせた.頑張れ自分で...
Reference
この問題について(Node.jsを使用してMySQLを処理), 我々は、より多くの情報をここで見つけました
https://velog.io/@yujiniii/Node.js로-MySQL-다루기
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
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');
});
{
"development": {
"username": "root",
"password": "1234",
"database": "nodejs",
"host": "127.0.0.1",
"dialect": "mysql"
},
...
}
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'});
}
};
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'});
}
}
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;
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;
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;
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;
Reference
この問題について(Node.jsを使用してMySQLを処理), 我々は、より多くの情報をここで見つけました https://velog.io/@yujiniii/Node.js로-MySQL-다루기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol