在NodeJS下实现简单的ORM框架

本文介绍了如何在NodeJS环境下,使用TypeScript和mysql库,从零开始实现一个轻量级的ORM框架。通过简单的步骤,包括安装typescript、创建nodejs项目、配置tsconfig.json、建立数据库连接和基本CRUD操作,作者展示了如何实现ORM类,并给出了User实体的使用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

      ORM即Object Relational Mapping,中文翻译过来就是对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。在nodejs中也有比较好用的ORM框架,比如TypeORM,Sequelize等等,但基本上都是重量级的,如果自己先实现一个简单的对数据库的增删改查,使用它们就感觉有点大材小用了。因此本文用简短的一百多行代码实现一个简单的ORM框架,使用TypeScript以及mysql包。

开始之前

安装typescript

npm install -g typescript

新建nodejs项目

npm init

安装mysql包

npm install --save mysql

在项目目录下,新建tsconfig.json文件,添加文件内容如下

{
  "compilerOptions": {
    "module": "commonjs",
    "target": "es2018",
    "sourceMap": true,
    "outDir": "./dist",
    "pretty": true,
    "baseUrl": "./lib",
    "moduleResolution": "node"
  },
  "include": [
    "lib/**/*.ts",
    "lib/*.ts"
  ],
  "exclude": [
    "node_modules"
  ]
}

在项目目录新建lib文件夹来存放.ts文件

注:在tsconfig.json目录下使用tsc命令能将ts文件打包成js文件,然后再使用node命令来运行js文件,或者使用node-ts来运行ts文件,需要安装node-ts包

npm install -g node-ts

ORM的简单实现

mysql.ts文件,主要实现连接mysql,以及一下基本的增删改查函数

import * as MySql from "mysql";
// 使用连接池
const mysqlPool = MySql.createPool({
    host: "localhost",
    user: "root",
    password: "",
    port: 3306,
    database: "blogapp",
    connectionLimit: 10000
});

const timeout = 4000;

export interface ISqlResults {
    results: Array<any>;
    fields: Object;
}

interface IQueryObject {
    [name: string]: string | number
}

// 实现增删改查基本方法

export const sqlQuery = (sql: MySql.QueryOptions) => new Promise((resolve, reject) =>
    mysqlPool.query(sql,
        (err, results, fields) => err ? reject(err) : resolve(<ISqlResults>{ results, fields })
    )
);

export const and = (dataObject: IQueryObject) => {
    let queryString = "";
    Object.keys(dataObject).forEach(key =&g
<think>好的,我现在需要回答用户关于使用Next.js或Node.js框架实现前后端数据库集成的问题。首先,我要确定用户的需求是什么。他们可能想了解如何结合前端和后端,以及如何连接数据库,使用这两种技术栈。用户可能是刚开始学习全栈开发,需要指导步骤和可能的工具选择。 首先,我应该分别介绍Next.js和Node.js在前后端中的作用。Next.js是一个React框架,支持服务端渲染和静态生成,同时也可以作为API路由的后端。Node.js是JavaScript运行时,常用于构建后端服务,配合Express等框架。 接下来,需要解释数据库的选择,比如关系型数据库如PostgreSQL或MySQL,或者NoSQL如MongoDB。然后,分步骤说明如何设置项目,创建API路由,连接数据库,以及处理CRUD操作。 对于Next.js部分,可能需要提到它的API路由功能,如何在pages/api目录下创建端点。而对于Node.js,使用Express来创建路由,中间件处理请求,以及使用ORM如Prisma或Mongoose来简化数据库操作。 还需要考虑安全性,比如环境变量的使用,防止SQL注入,以及身份验证和授权的实现。此外,前后端数据交互的格式,通常使用JSON,可能需要提到CORS配置。 可能会遗漏一些细节,比如具体的代码示例,或者不同数据库的具体配置步骤。需要确保步骤清晰,让用户能够跟随操作,同时提供一些扩展学习的资源,如官方文档或教程链接。 最后,总结两种方案的优缺点,帮助用户根据项目需求选择合适的技术栈。比如,Next.js适合全栈项目,而Node.js搭配Express更灵活,适合复杂的后端需求。</think>我将分步骤为您介绍使用 Next.js 和 Node.js 实现前后端数据库集成的两种典型方案: 1️⃣ **Next.js 全栈方案**(推荐) $\textcolor{blue}{特点:前后端一体化开发,适合中小型项目}$ ```bash npx create-next-app@latest # 创建项目 ``` ▌数据库配置(以 PostgreSQL 为例) ```javascript // lib/db.js import { Pool } from 'pg' const pool = new Pool({ user: process.env.DB_USER, host: process.env.DB_HOST, database: process.env.DB_NAME, password: process.env.DB_PASSWORD, port: 5432, }) export default pool ``` ▌API 路由示例(pages/api/users.js) ```javascript import pool from '../../lib/db' export default async function handler(req, res) { switch (req.method) { case 'GET': const { rows } = await pool.query('SELECT * FROM users') res.status(200).json(rows) break; case 'POST': const { name, email } = req.body await pool.query( 'INSERT INTO users(name, email) VALUES($1, $2)', [name, email] ) res.status(201).json({ message: 'User created' }) break; default: res.setHeader('Allow', ['GET', 'POST']) res.status(405).end(`Method ${req.method} Not Allowed`) } } ``` 2️⃣ **Node.js + Express 分离架构** $\textcolor{green}{特点:前后端分离,适合中大型项目}$ ▌项目结构 ``` project/ ├── client/ # 前端(React/Vue) ├── server/ # 后端 │ ├── models/ # 数据模型 │ ├── routes/ # API路由 │ └── app.js # 主入口 ``` ▌Express 服务配置 ```javascript // server/app.js const express = require('express') const mongoose = require('mongoose') const app = express() // 连接 MongoDB mongoose.connect(process.env.MONGODB_URI, { useNewUrlParser: true, useUnifiedTopology: true }) // 用户模型 const UserSchema = new mongoose.Schema({ name: String, email: { type: String, unique: true } }) const User = mongoose.model('User', UserSchema) // REST API app.get('/api/users', async (req, res) => { const users = await User.find() res.json(users) }) app.listen(3001, () => console.log('Server running on port 3001')) ``` $\textcolor{red}{关键配置注意事项:}$ 1. 环境变量管理:使用 `.env` 文件 + `dotenv` 包 2. 跨域处理:安装 `cors` 中间件 3. 请求体解析:`express.json()` 中间件 4. 生产环境部署:建议使用 Nginx 反向代理 ▌数据库选型对比 | 类型 | 代表产品 | 适用场景 | |------------|-------------|-------------------------| | 关系型数据库 | PostgreSQL | 复杂事务,数据关系明确 | | 文档数据库 | MongoDB | 灵活数据结构,快速迭代 | | 云数据库 | Firebase | 无服务器架构,实时同步 | $\textcolor{orange}{进阶功能建议:}$ - 使用 Prisma 作为 ORM 工具 - 集成 JWT 身份验证 - 实现分页查询 (Pagination) - 添加请求参数验证 - 编写单元测试(Jest + Supertest) 两种方案的选择建议: - 需要快速开发且功能简单 → Next.js 全栈方案 - 需要微服务架构/复杂业务逻辑 → Node.js 分离架构 - 需要服务端渲染(SSR) → Next.js 方案 - 需要完全的前后端分离 → Node.js + 前端框架 开发资源推荐: - Next.js 官方文档:https://nextjs.org/docs - Express 最佳实践:https://expressjs.com/en/advanced/best-practice-performance.html - Prisma 中文文档:https://prisma.yoga/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sundial dreams

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值