尝试创建适用于Nodejs的模型库【Express】

仓库

以下是「oreoreExpress」的GitHub链接:
https://github.com/kbc18a11/oreoreExpress

该库的主要部分是「oreoreExpress/database/AbstractModel.js」。

解答:
关于解释所需的构成和注意事项

    • FW:Express

 

    • ディレクトリ構成:WebStormの新規Expressプロジェクトの状態にプロジェクト名/databaseとプロジェクト名/modelというディレクトリを生成

 

    本記事はチーム開発のメンバーのマニュアルとしても書いていますので、ライブラリには直接関係ないことも書いています。

本次使用的tests表具有以下结构。

idtextcreated_atupdated_at

使用方法

如果要使用存储库中的内容,请执行以下命令:

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が存在しません"
        ]
    }
}
bannerAds