【nodejs】让nodejs像后端mvc框架(asp.net mvc)一orm篇【如EF般丝滑】typeorm介绍(8/8)

本文涉及的产品
云数据库 MongoDB,独享型 2核8GB
推荐场景:
构建全方位客户视图
简介: 文章目录前情概要在使用nodejs开发过程中,刚好碰到需要做一个小工具,需要用到数据库存储功能。而我又比较懒,一个小功能不想搞一个nodejs项目,又搞一个后端项目。不如直接在nodejs里面把对数据库的操作也做掉。

文章目录

前情概要

在使用nodejs开发过程中,刚好碰到需要做一个小工具,需要用到数据库存储功能。而我又比较懒,一个小功能不想搞一个nodejs项目,又搞一个后端项目。不如直接在nodejs里面把对数据库的操作也做掉。
结果百度一圈下来发现nodejs这边还都是比较原始的、类似后端的通过coneection连数据库,接着open,在写sql语句干嘛干嘛的。经过后端这么多年的脚手架工具熏陶,实在懒得写这些没营养的简单增删改查sql语句了。
typeorm github地址
typeorm github地址
遂通过baidu、google找到了typeorm这个orm框架。果然不错,作者自己也说大量参考了如entityframework、hibernate、dapper等等众多orm框架。吸收了各家之所长。
更多介绍和各种示例可以参考它的demo项目,基本每个数据库都有一个demo,然后对特性也基本都介绍到的。
比如mongodb如何映射复杂对象,关系型数据怎么弄级联删除之类的功能

使用总结

mysql、sqlite、mongodb3个数据库下都使用过,使用感觉虽然没有后端的orm那么强大,但是在nodejs领域内,orm我觉得它已经可以说是no.1啦。当然不排除我孤陋寡闻漏了更NB的其他框架。
绝大多数的后端orm该有的功能它都有,没有可能是没找到正确的使用方式。为此我还发过几条issue给开发者。基本上自己最后google找到解决方或者组件作者给与了回复。
基本功能介绍可以直接去GitHub看,基本上orm应该要有的功能它都有了。

typeorm 项目介绍

此项目github上的第一句介绍:
ORM for TypeScript and JavaScript (ES7, ES6, ES5). Supports MySQL, PostgreSQL, MariaDB, SQLite, MS SQL Server, Oracle, WebSQL databases. Works in NodeJS, Browser, Ionic, Cordova and Electron platforms.

remark:
TypeORM is highly influenced by other ORMs, such as Hibernate, Doctrine and Entity Framework.

Some TypeORM features:

  • supports both DataMapper and ActiveRecord (your choice)
  • entities and columns
  • database-specific column types
  • entity manager
  • repositories and custom repositories
  • clean object relational model
  • associations (relations)
  • eager and lazy relations
  • uni-directional, bi-directional and self-referenced relations
  • supports multiple inheritance patterns
  • cascades
  • indices
  • transactions
  • migrations and automatic migrations generation
  • connection pooling
  • replication
  • using multiple database connections
  • working with multiple databases types
  • cross-database and cross-schema queries
  • elegant-syntax, flexible and powerful QueryBuilder
  • left and inner joins
  • proper pagination for queries using joins
  • query caching
  • streaming raw results
  • logging
  • listeners and subscribers (hooks)
  • supports closure table pattern
  • schema declaration in models or separate configuration files
  • connection configuration in json / xml / yml / env formats
  • supports MySQL / MariaDB / Postgres / SQLite / Microsoft SQL Server / Oracle / sql.js
  • supports MongoDB NoSQL database
  • works in NodeJS / Browser / Ionic / Cordova / React Native / NativeScript / Expo / Electron platforms
  • TypeScript and JavaScript support
  • produced code is performant, flexible, clean and maintainable
  • follows all possible best practices
  • CLI
    And more...

个人的一些用法-mongodb

都是一些非常简单的封装,直接贴代码啦。

typeorm mongodb 初始化配置

比如数据库链接字符串,实体类,还有一些其他配置等等

InitMongoDb({
    url: _appConfig.mongodb.url,
    entities: ['bin/Entity/*.js'],
    synchronize: true,
    logging: false
});
export function InitMongoDb(dbName: string, mongoOptions: MongoConnectionOptions): void;
export function InitMongoDb(mongoOptions: MongoConnectionOptions): void;
export function InitMongoDb(): void {
    var options: MongoConnectionOptions = arguments[0];
    var dbName: any;
    if (typeof arguments[0] === 'string') {
        dbName = arguments[0];
        options = arguments[1];
    }

    var dbName = dbName || 'default';

    ManangerMongoConnection.ConnectOptions[dbName] = {
        hasGetConnection: false,
        options: options
    };
}

typeorm mongodb repository管理器

export async function getMongoRepositoryAsync<Entity>(entityClass: ObjectType<Entity>): Promise<GDMongoRepository<Entity>>;
export async function getMongoRepositoryAsync<Entity>(entityClass: ObjectType<Entity>, dbName: string): Promise<GDMongoRepository<Entity>>
export async function getMongoRepositoryAsync<Entity>(): Promise<GDMongoRepository<Entity>> {
    var entityClass = arguments[0] as ObjectType<Entity>;
    var dbName = (arguments.length > 1 ? arguments[1] : undefined) || 'default';

    var conn = await new ManangerMongoConnection().getConnection(dbName);
    var repo = conn.getMongoRepository(entityClass);
    var gdRepo = new GDMongoRepository(repo)
    return gdRepo;
}

class ManangerMongoConnection {
    static ConnectOptions: any = {};

    async getConnection(dbName: string): Promise<Connection> {
        var conf = ManangerMongoConnection.ConnectOptions[dbName];
        if (!conf)
            throw Error(`找不到(${dbName})的数据库配置`);
        if (conf.hasCreated)
            return conf.connection;

        var options = conf.options as MongoConnectionOptions;
        var conn = await createConnection({
            type: 'mongodb',
            url: options.url,
            synchronize: options.synchronize,
            logging: options.logging,
            entities: options.entities
        });
        conf.connection = conn;
        conf.hasCreated = true;
        return conn;
    }
}

typeorm mongodb repository 简单封装


import { ObjectType, FindManyOptions, MongoRepository, ObjectLiteral, Connection, createConnection, Entity, ObjectIdColumn, Column, ObjectID, getManager } from "typeorm";
import { ObjectId } from 'mongodb'

export class GDMongoRepository<TEntity extends ObjectLiteral> {
    private _repo: MongoRepository<TEntity>;
    constructor(repo: MongoRepository<TEntity>) {
        this._repo = repo;
    }
    SaveAsync(docment: TEntity): Promise<TEntity> {
        if (!docment.createdTime) docment.createdTime = new Date();
        return this._repo.save(docment);
    }
    FindByIdAsync(id: number | string) {
        return this._repo.findOneById(new ObjectId(id));
    }

    FindByIdsAsync(ids: number[] | string[]) {
        var _id: ObjectId[] = [];
        for (let index = 0; index < ids.length; index++) {
            const element = ids[index];
            _id.push(new ObjectId(element));
        }
        return this._repo.findByIds(_id);
    }
    FindAsync(optionsOrConditions?: FindManyOptions<TEntity> | Partial<TEntity> | ObjectLiteral): Promise<TEntity[]> {
        return this._repo.find(optionsOrConditions)
    }

    CountAsync(optionsOrConditions?: FindManyOptions<TEntity> | Partial<TEntity> | ObjectLiteral): Promise<number> {
        var query: any = Object.assign({}, optionsOrConditions);
        if (query.take) delete query.take;
        if (query.skip) delete query.skip;
        if (query.order) delete query.order;
        query = query.where || query;
        return this._repo.count(query)
    }
    FindAndCount(optionsOrConditions?: FindManyOptions<TEntity> | Partial<TEntity>): Promise<[TEntity[], number]> {
        return this._repo.findAndCount(optionsOrConditions)
    }

    AggregateAsync(pipeline: ObjectLiteral[]): Promise<TEntity[]> {
        return this._repo.aggregate(pipeline).toArray()
    }
    async RemoveByIdAsync(id: number | string): Promise<number> {
        var r = await this._repo.deleteOne({ _id: new ObjectId(id) });
        if (r.deletedCount)
            return r.deletedCount
        return 0;
    }
    async RemoveAsync(conditions: ObjectLiteral): Promise<number> {
        var r = await this._repo.deleteMany(conditions);
        if (r.deletedCount)
            return r.deletedCount
        return 0;
    }

    async UpdateByIdAsync(id: number | string, update: ObjectLiteral | Partial<TEntity>): Promise<number> {
        if (update.$set || update.$unset || update.$rename) { }
        else {
            update = { $set: update }
        }
        update.$set.lastModifyTime = new Date();
        var r = await this._repo.updateOne({ _id: new ObjectId(id) }, update);
        return r.modifiedCount;
    }

    async UpdateAsync(query: FindManyOptions<TEntity> | Partial<TEntity> | ObjectLiteral, update: ObjectLiteral | Partial<TEntity>): Promise<number> {
        if (update.$set || update.$unset || update.$rename) { }
        else {
            update = { $set: update }
        }
        update.$set.lastModifyTime = new Date();
        var r = await this._repo.updateMany(query, update);
        return r.modifiedCount;
    }
}

一些简单的使用例子

    public async list() {
        var repo = await getMongoRepositoryAsync(Host);
        var b = await repo.FindAsync();
        return b
    }

    public async info() {
        var repo = await getMongoRepositoryAsync(Host);
        var b = await repo.FindAsync({ Ip: this.request.query.ip, HostEnv: this.request.query.env });
        return b
    }

给开源项目点赞!给国际友人点赞!

相关实践学习
MongoDB数据库入门
MongoDB数据库入门实验。
快速掌握 MongoDB 数据库
本课程主要讲解MongoDB数据库的基本知识,包括MongoDB数据库的安装、配置、服务的启动、数据的CRUD操作函数使用、MongoDB索引的使用(唯一索引、地理索引、过期索引、全文索引等)、MapReduce操作实现、用户管理、Java对MongoDB的操作支持(基于2.x驱动与3.x驱动的完全讲解)。 通过学习此课程,读者将具备MongoDB数据库的开发能力,并且能够使用MongoDB进行项目开发。 &nbsp; 相关的阿里云产品:云数据库 MongoDB版 云数据库MongoDB版支持ReplicaSet和Sharding两种部署架构,具备安全审计,时间点备份等多项企业能力。在互联网、物联网、游戏、金融等领域被广泛采用。 云数据库MongoDB版(ApsaraDB for MongoDB)完全兼容MongoDB协议,基于飞天分布式系统和高可靠存储引擎,提供多节点高可用架构、弹性扩容、容灾、备份回滚、性能优化等解决方案。 产品详情: https://www.aliyun.com/product/mongodb
目录
相关文章
|
1月前
|
Web App开发 JavaScript 前端开发
深入浅出Node.js后端框架
【10月更文挑战第34天】在数字化时代,后端开发如同一座桥梁,连接着用户界面与数据处理的两端。本文将通过Node.js这一轻量级、高效的平台,带领读者领略后端框架的魅力。我们将从基础概念出发,逐步深入到实战应用,最后探讨如何通过代码示例来巩固学习成果,使读者能够在理论与实践之间架起自己的桥梁。
|
1月前
|
设计模式 开发框架 JavaScript
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
基于.NET8 + Vue/UniApp前后端分离的快速开发框架,开箱即用!
|
2月前
|
XML JSON API
ServiceStack:不仅仅是一个高性能Web API和微服务框架,更是一站式解决方案——深入解析其多协议支持及简便开发流程,带您体验前所未有的.NET开发效率革命
【10月更文挑战第9天】ServiceStack 是一个高性能的 Web API 和微服务框架,支持 JSON、XML、CSV 等多种数据格式。它简化了 .NET 应用的开发流程,提供了直观的 RESTful 服务构建方式。ServiceStack 支持高并发请求和复杂业务逻辑,安装简单,通过 NuGet 包管理器即可快速集成。示例代码展示了如何创建一个返回当前日期的简单服务,包括定义请求和响应 DTO、实现服务逻辑、配置路由和宿主。ServiceStack 还支持 WebSocket、SignalR 等实时通信协议,具备自动验证、自动过滤器等丰富功能,适合快速搭建高性能、可扩展的服务端应用。
160 3
|
12天前
|
消息中间件 开发框架 监控
NET任务调度框架Hangfire使用指南
Hangfire 是一个用于 .NET 应用程序的开源任务调度框架,支持长时间运行任务、定时任务等。通过简单的安装配置,即可将任务从主线程分离,提升应用性能。支持多种数据库,提供丰富的任务类型如立即执行、延迟执行和周期性任务,并有可视化管理界面 Hangfire Dashboard。还支持安全性配置及扩展插件,如 Hangfire.HttpJob,适合各种复杂场景下的任务调度需求。
37 1
NET任务调度框架Hangfire使用指南
|
28天前
|
缓存 负载均衡 JavaScript
构建高效后端服务:Node.js与Express框架实践
在数字化时代的浪潮中,后端服务的重要性不言而喻。本文将通过深入浅出的方式介绍如何利用Node.js及其强大的Express框架来搭建一个高效的后端服务。我们将从零开始,逐步深入,不仅涉及基础的代码编写,更会探讨如何优化性能和处理高并发场景。无论你是后端新手还是希望提高现有技能的开发者,这篇文章都将为你提供宝贵的知识和启示。
|
1月前
|
开发框架 安全 .NET
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱
在数字化时代,.NET 技术凭借跨平台兼容性、丰富的开发工具和框架、高效的性能及强大的安全稳定性,成为软件开发的重要支柱。它不仅加速了应用开发进程,提升了开发质量和可靠性,还促进了创新和业务发展,培养了专业人才和技术社区,为软件开发和数字化转型做出了重要贡献。
24 5
|
1月前
|
传感器 人工智能 供应链
.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。
本文深入探讨了.NET开发技术在数字化时代的创新作用,从高效的开发环境、强大的性能表现、丰富的库和框架资源等方面揭示了其关键优势。通过企业级应用、Web应用及移动应用的创新案例,展示了.NET在各领域的广泛应用和巨大潜力。展望未来,.NET将与新兴技术深度融合,拓展跨平台开发,推动云原生应用发展,持续创新。
32 4
|
1月前
|
开发框架 .NET C#
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位
.NET 技术凭借高效开发环境、强大框架支持及跨平台特性,在软件开发中占据重要地位。从企业应用到电子商务,再到移动开发,.NET 均展现出卓越性能,助力开发者提升效率与项目质量,推动行业持续发展。
29 4
|
1月前
|
消息中间件 监控 数据可视化
基于.NET开源、功能强大且灵活的工作流引擎框架
基于.NET开源、功能强大且灵活的工作流引擎框架
|
1月前
|
开发框架 网络协议 .NET
C#/.NET/.NET Core优秀项目和框架2024年10月简报
C#/.NET/.NET Core优秀项目和框架2024年10月简报
下一篇
DataWorks