尝试创建适用于Nodejs的模型库【Express】
仓库
以下是「oreoreExpress」的GitHub链接:
https://github.com/kbc18a11/oreoreExpress
该库的主要部分是「oreoreExpress/database/AbstractModel.js」。
解答:
关于解释所需的构成和注意事项
-
- FW:Express
-
- ディレクトリ構成:WebStormの新規Expressプロジェクトの状態にプロジェクト名/databaseとプロジェクト名/modelというディレクトリを生成
- 本記事はチーム開発のメンバーのマニュアルとしても書いていますので、ライブラリには直接関係ないことも書いています。
本次使用的tests表具有以下结构。
使用方法
如果要使用存储库中的内容,请执行以下命令:
npm安装mysql2
如果只使用库,安装mysql2和date-utlis:
npm安装mysql2
npm安装date-utlis
然后按照以下步骤创建mysql2的配置文件。
const mysql = require('mysql2');
//MySQLの接続設定
const connection = mysql.createConnection({
host: 'localhost',
user: '',
password: '',
database: ''
}).promise();
module.exports = connection;
请按照下述方式设置要创建的模型类。
并且覆盖以下方法。
抽象TABLE_NAME
抽象VALIDATIONRULES
更新
抽象方法abstractTABLE_NAME是指与之相连的表名。
抽象方法abstractVALIDATIONRULES用于描述验证规则。
验证规则是基于validatorjs的规则。
https://www.npmjs.com/package/validatorjs
const AbstractModel = require('./AbstractModel');
const connection = require('../database/mysqlConnection');
require('date-utils');
class Tests extends AbstractModel {
constructor() {
super();
}
/**
* テーブル名
* @override
* @returns {string}
*/
static get abstractTABLE_NAME() {
return 'tests';
}
/**
* バリデーションルール
* @override
* @return {Object}
*/
static get abstractVALIDATIONRULES() {
return {
get:{
rule: {
id: 'required|integer'
},
errorMessage: {
required: '必須項目です。',
integer: '数値で入力してください'
}
},
//POSTリクエスト用
post: {
rule: {
text: 'required'
},
errorMessage: {
required: '必須項目です。',
}
},
//PUTリクエスト用
put: {
rule: {
id: 'required|integer',
text: 'required'
},
errorMessage: {
required: '必須項目です。',
integer: '数値で入力してください'
}
},
//DELETEリクエスト用
delete: {
rule: {
id: 'required|integer'
},
errorMessage: {
required: '必須項目です。',
integer: '数値で入力してください'
}
}
};
}
/**
* UPDATE文の準備を行って、親クラスのupdate()に実行をさせる
* @param {Object} insertParam
*/
static async update(insertParam) {
//UPDATE文
const sql = `UPDATE ${this.abstractTABLE_NAME} SET text = ?,updated_at = ? WHERE id = ?`;
//create_at用の日付時間取得
insertParam.updated_at = new Date().toFormat('YYYY-MM-DD HH:MI:SS');
//SQLの実行
await super.update(insertParam, sql);
}
}
module.exports = Tests;
功能 can be paraphrased as 功能特性 .
一般情况下,如果要使用库的功能,需要在Express的路由文件的匿名函数中加上async关键字。
router.get('/tests', async (req, res, next) => {
然后,在路由文件中使用以下的库。
const express = require('express');
const router = express.Router();
const validator = require('validatorjs');
const Tests = require('../model/Tests');
在图书馆中操作数据库的方法涉及到Promise对象,因此在调用时需要添加await。
//レコードをすべて取得
await Test.all()
//引数idのカラム取得
await Test.find(id)
//引数idの存在確認を行う
await Test.existId(id)
//引数paramの値で新規登録を行う
await Test.insert(param)
//引数paramの値で更新を行う
await Test.update(param)
//引数idのレコードを削除する
await Test.delete(id)
获取所有记录。
/**
* @GET
* testsのレコードをすべて取得
*/
router.get('/tests', async (req, res, next) => {
try {
//レコードをすべて取得
const allRows = await Tests.all();
//レコードを返す
return res.send(allRows);
} catch (error) {
//レコードの取得失敗時
console.log(error);
res.status(500);
return res.send({'error': 'サーバー側でエラーが発生しました'});
}
});
在本地主机上以GET方式访问http://localhost:3000/tests。
[
{
"id": 1,
"text": "これはテストです",
"created_at": "2020-06-18T16:50:45.000Z",
"updated_at": null
},
{
"id": 2,
"text": "これはテストです",
"created_at": "2020-06-18T16:50:50.000Z",
"updated_at": null
},
{
"id": 3,
"text": "これはテストです",
"created_at": "2020-06-18T16:50:51.000Z",
"updated_at": null
}
]
根据id找到相应的列数据
/**
* @GET
* 指定されたidのカラムを取得
*/
router.get('/tests/:id', async (req, res, next) => {
//バリデーションの検証を受ける値
const verificationValue = {
id: req.params.id
}
//バリデーションの結果にエラーがあるかのチェック
const validation = new validator(
verificationValue,
Tests.abstractVALIDATIONRULES.get.rule,
Tests.abstractVALIDATIONRULES.get.errorMessage
);
if (validation.fails()) {
//エラーを422で返す
return res.status(422).send({errors: validation.errors.all()});
}
try {
//レコードを取得
const row = await Tests.find(verificationValue.id);
//レコードを返す
return res.send(row);
} catch (error) {
//レコードの取得失敗時
console.log(error);
res.status(500);
return res.send({'error': 'サーバー側でエラーが発生しました'});
}
})
请使用GET方法访问 http://localhost:3000/(指定test的id)。
[
{
"id": 1,
"text": "これはテストです",
"created_at": "2020-06-18T16:50:45.000Z",
"updated_at": null
}
]
此外,若指定URI的id部分不是数字,将返回以下错误消息:
http://localhost:3000/aaaa77
{
"errors": {
"id": [
"数値で入力してください"
]
}
}
使用`insert()`函数以参数`param`的值进行新的注册
/**
* @POST
* testsに新しいレコードを挿入
*/
router.post('/test', async (req, res, next) => {
//バリデーションの検証を受ける値
const verificationValue = {
text: req.query.text
}
//バリデーションの結果にエラーがあるかのチェック
const validation = new validator(
verificationValue,
Tests.abstractVALIDATIONRULES.post.rule,
Tests.abstractVALIDATIONRULES.post.errorMessage
);
if (validation.fails()) {
//エラーを422で返す
return res.status(422).send({errors: validation.errors.all()});
}
try {
//レコードの挿入開始
await Tests.insert({text: req.query.text});
return res.send({'insertResult': true});
} catch (error) {
//レコードの挿入失敗時
console.log(error);
return res.status(500).send({'insertResult': false});
}
});
只需一个翻译选项:
通过POST方法访问http://localhost:3000/test?text=テストやりたい。
[
{
"id": 1,
"text": "これはテストです",
"created_at": "2020-06-18T16:50:45.000Z",
"updated_at": null
}
]
如果请求的主体中没有包含文本(text),则返回错误消息。
{
"errors": {
"text": [
"必須項目です。"
]
}
}
使用参数param进行更新操作 更新存在在参数id下的id的确认
/**
* @PUT
* レコードの更新
*/
router.put('/test/:id', async (req, res, next) => {
//バリデーションの検証を受ける値
const verificationValue = {
id: req.params.id,
text: req.query.text
}
//バリデーションの結果にエラーがあるかのチェック
const validation = new validator(
verificationValue,
Tests.abstractVALIDATIONRULES.put.rule,
Tests.abstractVALIDATIONRULES.put.errorMessage
);
if (validation.fails()) {
//エラーを422で返す
return res.status(422).send({errors: validation.errors.all()});
}
//idは存在しないか?
if (!await Tests.existId(verificationValue.id)) {
//エラーを422で返す
return res.status(422).send({
errors: {
id: ['idが存在しません']
}
});
}
try {
//レコードの更新開始
await Tests.update(verificationValue);
return res.send({'updateResult': true});
} catch (error) {
//レコードの更新失敗時
console.log(error);
return res.status(500).send({'updateResult': false});
}
});
使用PUT方法访问 http://localhost:3000/test?text=テストやりたい。
{
"updateResult": true
}
如果没有指定URI的id,且数值以外或请求的正文中没有文本,则会返回错误消息。
http://localhost:3000/test/aaa
{
"errors": {
"id": [
"数値で入力してください"
],
"text": [
"必須項目です。"
]
}
}
当使用find(id)函数且传入的id在记录中不存在时,将返回这样的错误。
{
"errors": {
"id": [
"idが存在しません"
]
}
}
删除(id),删除参数id的记录。
/**
* @DELETE
* レコードの削除
*/
router.delete('/test/:id', async (req, res, next) => {
//バリデーションの検証を受ける値
const verificationValue = {
id: req.params.id,
}
//バリデーションの結果にエラーがあるかのチェック
const validation = new validator(
verificationValue,
Tests.abstractVALIDATIONRULES.delete.rule,
Tests.abstractVALIDATIONRULES.delete.errorMessage
);
if (validation.fails()) {
//エラーを422で返す
return res.status(422).send({errors: validation.errors.all()});
}
//idは存在しないか?
if (!await Tests.existId(verificationValue.id)) {
//エラーを422で返す
return res.status(422).send({
errors: {
id: ['idが存在しません']
}
});
}
try {
//レコードの削除開始
await Tests.delete(verificationValue.id);
return res.send({'deleteResult': true});
} catch (error) {
//レコードの削除失敗時
console.log(error);
return res.status(500).send({'deleteResult': false});
}
})
使用DELETE方法访问http://localhost:3000/(指定test的id)。
[
{
"id": 1,
"text": "これはテストです",
"created_at": "2020-06-18T16:50:45.000Z",
"updated_at": null
}
]
如果指定URI的id不是数字,则返回以下错误消息。
http://localhost:3000/aaaa77
如果URI的id不是数字,则返回错误消息。
{
"errors": {
"id": [
"数値で入力してください"
]
}
}
当使用find(id)函数的参数id在记录中不存在时,将返回此类错误。
{
"errors": {
"id": [
"idが存在しません"
]
}
}