布景
最近在研究怎么进行研制提效的事。事务有这么几个特点:
- 插件开发,项目多而小,前后端都没那么难;
- 后端绝大多数逻辑都是 CRUD,数据结构也很简略;
- 前端 UI 用组件库就行,逻辑基本上就是调用 CRUD 的接口或一些 OpenAPI;
那么针对这些特点,优先进步一下后端的开发效率。每次都新建个 Git Repo,搞一套 CI/CD 实在是太重了。所以我盯上了 FaaS,也就是「云函数」。由于本文的要点不是它,所以就不多扩展了,不知道 FaaS 也不会影响后边的内容,只要知道它直接在云服务供给的浏览器 IDE 里面写一个函数,就能生成一个 API 就可以了。当然也少不了「云数据库」,不知道也没关系,仍是不影响后文的了解。
总归,我现在要快速搞一个 CRUD 的项目,来跑一下整个流程。下面来看看我是怎么跟 C 教师对话得到我想要的内容的吧。
总结
由于聊天内容太长了,所以仍是先把总结写在前面吧,把聊天记载放到后边咱们逐渐看。
- 首要,最终生成的代码肯定是可以跑的,不过参数仍是需求自己修改,所以仍是要有一些编程基础啊;
- 然后,C 教师是真的能帮码农进步效率,我用的还仅仅 GPT3.5,目前看来作用我现已很满足了;
- 最终,最最重要的是你得会发问。我也是混了好几天 码农翻身 – ChatGPT 基地 的常识星球,看了很多案例,还自己实践了几天才逐渐掌握窍门的;
小 Tips:告知咱们个小窍门,最好一起开 2 个以上的 tab,一个专门用来查琐细的小问题,一个保持上下文的洁净。很好用。
把我问 C 教师的问题提炼出来,咱们先过一下目,实际上也就 10 个问题而已。剩下那么多内容都是 C 教师答复的:
- 你是一个十分有经历的程序员,我想向你询问一些编程方面的问题。你可以用专业名词回复我,而不需求解说它们,我自己回去查。你可以优先答复思路和进程,而不需求立刻就回来给我代码。直到我跟你说“请给我代码”,你再把详细代码展现给我。总归,一次答复当中,请尽量全部都是思路或许全部都是代码,而且信息密度要尽量大。假如你理解了,请回复“理解”
- 我想在 mysql 中新建一个测验的用户和测验用的db,要怎么做
- 我现已装置了 MySQL,现在请告知我 nodejs 的详细代码
- 能不能从新建文件开始,把每一步写的详细一点
- npm 包 mysql 和 mysql2 有什么差异?
- 那请把上面的比如用 mysql2 再给一遍吧
- 请把 morgan 的代码加到上面的 nodejs Demo 代码中,给我展现完好的代码
- 上文中 mysql 的 users 表的结构是什么样的
- 我现在有了如下服务,请在浏览器的 console 中输入代码,为我创立20条数据,直接给我代码即可 【code】
- 请参阅下面已有的 3 条数据的格局,为我生成20条模仿数据,静态数据即可,不需求用代码动态生成:【code】
下面就是比较完好的聊天记载了,咱们逐渐看~~
聊天进程 TL;DR
注:我将一些不成功的发问过滤掉了,留下的都是比较要害的有用的发问。
1. 先给它角色
来自你的音讯:
你是一个十分有经历的程序员,我想向你询问一些编程方面的问题。你可以用专业名词回复我,而不需求解说它们,我自己回去查。你可以优先答复思路和进程,而不需求立刻就回来给我代码。直到我跟你说“请给我代码”,你再把详细代码展现给我。总归,一次答复当中,请尽量全部都是思路或许全部都是代码,而且信息密度要尽量大。假如你理解了,请回复“理解”
来自 ChatGPT 的音讯:
理解。
2. 先把 MySQL 准备好
装置什么的我就省掉了,其实我开了另一个 tab 来问这些琐细的问题,以免主 tab 中的上下文太混乱。
来自你的音讯:
我想在 mysql 中新建一个测验的用户和测验用的db,要怎么做
来自 ChatGPT 的音讯:
你可以依照以下进程在 MySQL 中新建一个测验用户和测验数据库:
以超级用户(如 root 用户)衔接到 MySQL 服务器,可以运用以下指令衔接:
mysql -u root -p
然后输入超级用户的暗码进行身份验证。
创立一个新的数据库,可以运用以下指令:
CREATE DATABASE testdb;
这将创立一个名为 testdb 的数据库。
创立一个新的用户,可以运用以下指令:
CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'mypassword';
这将创立一个名为 testuser 的用户,并运用暗码 mypassword 进行身份验证。其间,
'localhost'
表明该用户只能从本地进行衔接。将 testuser 用户赋予拜访 testdb 数据库的权限,可以运用以下指令:
GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost';
这将使 testuser 用户拥有拜访 testdb 数据库的一切权限。
退出 MySQL 客户端,可以运用以下指令:
EXIT;
现在,你现已成功创立了一个名为 testuser 的用户,以及一个名为 testdb 的数据库,而且颁发了 testuser 用户拜访 testdb 数据库的权限。你可以运用以下指令来衔接到 MySQL 服务器并运用 testuser 用户拜访 testdb 数据库:
mysql -u testuser -p testdb
然后输入 testuser 用户的暗码进行身份验证。
3. 接下来让 Nodejs 和 MySQL 连起来
来自你的音讯:
我现已装置了 MySQL,现在请告知我 nodejs 的详细代码
来自 ChatGPT 的音讯:
好的,Node.js 衔接 MySQL 数据库的基本进程如下:
- 装置 mysql2 模块
在终端中运转以下指令来装置 mysql2 模块:
npm install mysql2
- 在程序中衔接 MySQL 数据库
运用以下代码衔接 MySQL 数据库:
const mysql = require('mysql2'); // 创立衔接池 const pool = mysql.createPool({ host: 'localhost', // 数据库地址 user: 'root', // 数据库用户 password: 'password', // 数据库暗码 database: 'database_name', // 数据库称号 waitForConnections: true, connectionLimit: 10, queueLimit: 0 }); // 运用衔接池查询数据 pool.query('SELECT * FROM your_table_name', function (err, results, fields) { if (err) throw err; console.log(results); });
这儿,你需求将数据库地址、数据库用户、数据库暗码和数据库称号替换为你自己的数据。
在以上代码中,咱们先创立了一个衔接池,然后经过衔接池来查询数据库,MySQL 衔接池是一种重用衔接的技术,对于高并发的恳求能更快的呼应,一起具有更好的可扩展性。
来自你的音讯:
能不能从新建文件开始,把每一步写的详细一点
来自 ChatGPT 的音讯:
当然可以,咱们从头开始一步一步地建立一个带 MySQL 数据库的 Node.js 服务:
- 首要,打开终端,运用指令行东西创立一个新的文件夹,例如运用以下指令:
mkdir my-node-app
- 然后,进入这个文件夹,运用以下指令初始化一个 Node.js 项目:
cd my-node-app npm init
在运转
npm init
指令时会提示你输入一些项目信息,例如项目称号、描述、作者等等。你可以依据自己的需求自行填写。
- 接下来,咱们需求在项目中装置 MySQL 驱动程序,运用以下指令在项目中装置
mysql
模块:npm install mysql
- 装置完成后,在根目录创立一个名为
index.js
的文件,并在文件中引进mysql
模块:
const mysql = require('mysql');
- 接着,咱们需求衔接到 MySQL 数据库。可以先创立一个衔接池,便于咱们重复运用数据库衔接。衔接池可以主动办理衔接的创立和开释,避免频繁地创立和毁掉衔接,进步性能。以下是示例代码:
const pool = mysql.createPool({ connectionLimit: 10, host: 'localhost', user: 'root', password: 'password', // 这儿需求修改为你自己的暗码 database: 'my_database' // 这儿需求修改为你自己的数据库名 });
解说一下上面的代码,其间
connectionLimit
用于设置衔接池的最大衔接数,host
用于设置 MySQL 数据库的主机名或 IP 地址,user
和password
分别对应 MySQL 数据库的用户名和暗码,database
对应衔接的数据库名。你需求依据自己的详细情况修改这些装备。
- 最终,在回调函数中履行 SQL 查询句子。以下是一个简略的查询示例,该查询句子会查询一个名为
users
的表中的一切行:
pool.getConnection((err, connection) => { if (err) throw err; // 查询失败抛出反常 const sql = 'SELECT * FROM users'; connection.query(sql, (error, results, fields) => { connection.release(); // 开释衔接 if (error) throw error; // 查询失败抛出反常 console.log(results); // 输出查询成果 }); });
解说一下上面的代码,
getConnection
办法实现从衔接池中获取一个衔接,履行查询之前需求获取一个衔接。query
办法履行 SQL 查询句子,查询完成后需求开释衔接(运用release()
办法)以便衔接池可以重复运用这个衔接。results
参数对应查询成果,fields
参数对应一切字段的元数据信息。到这儿停止,咱们现已完成了一个带 MySQL 数据库的 Node.js 服务的建立进程。假如你想要更深入地了解 Node.js 和 MySQL 数据库的相关内容,可以参阅官方文档或许各种在线教程。
4. 小插曲 – 把 C 教师拉回 mysql2
注:这块出了点小情况。C 教师一会用 mysql2
一会用 mysql
,有点乱。想了想仍是把这段留下来,也算是给咱们一个参阅,看我是怎么把它拉回来的。其实我问的问题不多,但是它答复的内容比较多,各位可以快速扫一下就行了。
来自你的音讯:
npm 包 mysql 和 mysql2 有什么差异?
来自 ChatGPT 的音讯:
mysql
和mysql2
都是 Node.js 中衔接 MySQL 数据库的第三方库,它们的主要差异在于性能和功用特性。
mysql
是衔接 MySQL 最常见的 Node.js 库之一,由于它是最早的 Node.js MySQL 驱动程序之一。它可以衔接 MySQL 数据库并履行查询,但是它在处理多个查询时性能比较低,而且它不支撑异步/等待接口。相比之下,
mysql2
这个包致力于供给更高的性能和全面的特性。与mysql
不同的是,mysql2
是一个运用纯 JavaScript 编写的库,并支撑很多额定的功用,例如:支撑 promises、streaming resultsets、仿制流和支撑视图,一起避免了在履行查询句子时被攻击者运用。因而,假如您需求高性能和全面的特性,那么主张运用
mysql2
来衔接 MySQL 数据库。但是假如你的运用程序需求与一个老的,只支撑mysql
的版别兼容,或许你不需求mysql2
的某些特性,那么还可以继续运用mysql
。来自你的音讯:
那请把上面的比如用 mysql2 再给一遍吧
来自 ChatGPT 的音讯:
好的,以下是运用
mysql2
来查询 MySQL 数据库并回来成果的示例代码:
const mysql = require('mysql2'); const pool = mysql.createPool({ host: 'localhost', user: 'root', password: 'password', database: 'database_name', waitForConnections: true, connectionLimit: 10, queueLimit: 0 }); function queryDatabase(sql, params, callback) { pool.query(sql, params, function (error, results, fields) { if (error) { return callback(error, null); } return callback(null, results); }); } // 运用示例 const sql = 'SELECT * FROM table_name WHERE id = ?'; const params = [1]; queryDatabase(sql, params, function (error, results) { if (error) { console.log(error); return; } console.log(results); });
上面的代码示例中,咱们运用
mysql2
来创立衔接池,并经过衔接池来查询数据库。留意,mysql2
支撑运用参数占位符(?
)来防止 SQL 注入攻击。当查询履行完成后,咱们调用回调函数来开释衔接并回来查询成果。
5. 第一版比较完好的代码
注:这块省掉了一段加 morgan
日志的对话,不耽搁。
来自你的音讯:
请把 morgan 的代码加到上面的 nodejs Demo 代码中,给我展现完好的代码
来自 ChatGPT 的音讯:
好的,请参阅下面的完好代码,我现已加入了 morgan 中间件并进行了相应的注释:
// 引进必备模块 const express = require('express'); const bodyParser = require('body-parser'); const mysql = require('mysql'); const morgan = require('morgan'); // 引进 morgan 中间件 // 创立 express 运用 const app = express(); // 运用 body-parser 中间件来解析恳求体中的 JSON 数据 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); // 运用 morgan 中间件来记载每一次恳求的信息 app.use(morgan('combined')); // 创立一个 MySQL 数据库衔接池 const pool = mysql.createPool({ connectionLimit: 10, // 最多一起处理 10 个衔接恳求 host: 'localhost', // 数据库服务器的地址 user: 'root', // 登录数据库的用户名 password: 'password', // 登录数据库的暗码 database: 'test', // 要衔接的数据库的姓名 }); // GET 恳求的处理程序 app.get('/users', (req, res) => { // 由于经过 URL 查询字符串也可以传递客户端数据,所以这儿也解析一下查询字符串中的参数 const { name } = req.query; // 查询数据 let sql = 'SELECT * FROM users'; if (name) { sql += ` WHERE name LIKE '%${name}%'`; } pool.query(sql, (error, results) => { if (error) { res.status(500).send(error); } else { res.send(results); } }); }); // POST 恳求的处理程序 app.post('/users', (req, res) => { // 获取客户端提交的数据 const { name, email } = req.body; // 把数据刺进到数据库中 pool.query('INSERT INTO users SET ?', { name, email }, (error, results) => { if (error) { res.status(500).send(error); } else { res.send(results); } }); }); // PUT 恳求的处理程序 app.put('/users/:id', (req, res) => { // 获取客户端提交的数据和 URL 中的参数 const { id } = req.params; const { name, email } = req.body; // 更新指定 ID 的数据 pool.query('UPDATE users SET ? WHERE id = ?', [{ name, email }, id], (error, results) => { if (error) { res.status(500).send(error); } else { res.send(results); } }); }); // DELETE 恳求的处理程序 app.delete('/users/:id', (req, res) => { // 获取 URL 中的参数 const { id } = req.params; // 删去指定 ID 的数据 pool.query('DELETE FROM users WHERE id = ?', id, (error, results) => { if (error) { res.status(500).send(error); } else { res.send(results); } }); }); // 发动服务器 app.listen(3000, () => { console.log('Server is running at http://localhost:3000'); });
以上就是完好代码,假如您需求对接自己的 MySQL 数据库,需求修改
host
、user
、password
和database
这四个参数,分别代表数据库服务器的地址、登录数据库的用户名、暗码和要衔接的数据库的姓名。
6. 居然还没建表
注:先有了代码,后建的表,如同跟平时作业相反哈。不过仔细想想,这才是正常的思维啊,现有事务的描述,然后才能想出来怎么建表嘛。只不过咱们在描述事务的进程中,现已把代码提前写出来了而已。
来自你的音讯:
上文中 mysql 的 users 表的结构是什么样的
来自 ChatGPT 的音讯:
很抱歉我没有供给相关信息,下面是 users 表的结构。
CREATE TABLE users ( id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, name VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL UNIQUE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
这个 SQL 句子会在 MySQL 数据库中创立一个名为 users 的表,它包含三个列:id、name 和 email。其间,id 是一个自增的整数,作为主键,name 和 email 都是必填项,email 还需求确保唯一性。该表运用 InnoDB 引擎,字符集为 utf8mb4,运用 utf8mb4_unicode_ci 算法进行比较和排序。
7. 调用接口试试,趁便多生成几条数据
注:这块 C 教师如同把上下文忘了,只能我手动给它补上了。别的,生成的代码由于 async/await 的语法原因,还不能直接在 console 里运转,仍是需求小改一下的。只要去掉 async,把 await 改成 promise 的写法就行了。这儿就留个动手题咱们自己试一下吧。
来自你的音讯:
我现在有了如下服务,请在浏览器的 console 中输入代码,为我创立20条数据,直接给我代码即可
// 引进必备模块 const express = require('express'); const bodyParser = require('body-parser'); const mysql = require('mysql'); const morgan = require('morgan'); // 引进 morgan 中间件 // 创立 express 运用 const app = express(); // 运用 body-parser 中间件来解析恳求体中的 JSON 数据 app.use(bodyParser.json()); app.use(bodyParser.urlencoded({ extended: true })); // 运用 morgan 中间件来记载每一次恳求的信息 app.use(morgan('combined')); // 创立一个 MySQL 数据库衔接池 const pool = mysql.createPool({ connectionLimit: 10, // 最多一起处理 10 个衔接恳求 host: 'localhost', // 数据库服务器的地址 user: 'root', // 登录数据库的用户名 password: 'password', // 登录数据库的暗码 database: 'test', // 要衔接的数据库的姓名 }); // GET 恳求的处理程序 app.get('/users', (req, res) => { // 由于经过 URL 查询字符串也可以传递客户端数据,所以这儿也解析一下查询字符串中的参数 const { name } = req.query; // 查询数据 let sql = 'SELECT * FROM users'; if (name) { sql += ` WHERE name LIKE '%${name}%'`; } pool.query(sql, (error, results) => { if (error) { res.status(500).send(error); } else { res.send(results); } }); }); // POST 恳求的处理程序 app.post('/users', (req, res) => { // 获取客户端提交的数据 const { name, email } = req.body; // 把数据刺进到数据库中 pool.query('INSERT INTO users SET ?', { name, email }, (error, results) => { if (error) { res.status(500).send(error); } else { res.send(results); } }); }); // PUT 恳求的处理程序 app.put('/users/:id', (req, res) => { // 获取客户端提交的数据和 URL 中的参数 const { id } = req.params; const { name, email } = req.body; // 更新指定 ID 的数据 pool.query('UPDATE users SET ? WHERE id = ?', [{ name, email }, id], (error, results) => { if (error) { res.status(500).send(error); } else { res.send(results); } }); }); // DELETE 恳求的处理程序 app.delete('/users/:id', (req, res) => { // 获取 URL 中的参数 const { id } = req.params; // 删去指定 ID 的数据 pool.query('DELETE FROM users WHERE id = ?', id, (error, results) => { if (error) { res.status(500).send(error); } else { res.send(results); } }); }); // 发动服务器 app.listen(3000, () => { console.log('Server is running at http://localhost:3000'); });
来自 ChatGPT 的音讯:
以下是用 fetch 函数向服务器批量创立20条数据的代码:
// 定义函数,用于发送 POST 恳求并创立数据 async function createUsers() { const endpoint = 'http://localhost:3000/users'; const headers = { 'Content-Type': 'application/json' }; const data = [ { name: 'Alice', email: 'alice@example.com' }, { name: 'Bob', email: 'bob@example.com' }, { name: 'Charlie', email: 'charlie@example.com' }, // ...还有17条数据 ]; try { const response = await fetch(endpoint, { method: 'POST', headers, body: JSON.stringify(data), }); const result = await response.json(); console.log('创立成功:', result); } catch (error) { console.error('创立失败:', error); } } // 调用函数,创立数据 createUsers();
留意:以上代码需求在浏览器的 console 中履行,而不是在服务器端编写和运转。
来自你的音讯:
请参阅下面已有的 3 条数据的格局,为我生成20条模仿数据,静态数据即可,不需求用代码动态生成:
const data = [ { name: ‘Alice’, email: ‘alice@example.com’ }, { name: ‘Bob’, email: ‘bob@example.com’ }, { name: ‘Charlie’, email: ‘charlie@example.com’ }, // …还有17条数据 ];
来自 ChatGPT 的音讯:
依据上述数据格局,以下是生成20条静态数据的一种办法:
const data = [ { name: 'Alice', email: 'alice@example.com' }, { name: 'Bob', email: 'bob@example.com' }, { name: 'Charlie', email: 'charlie@example.com' }, { name: 'David', email: 'david@example.com' }, { name: 'Emma', email: 'emma@example.com' }, { name: 'Frank', email: 'frank@example.com' }, { name: 'Grace', email: 'grace@example.com' }, { name: 'Hannah', email: 'hannah@example.com' }, { name: 'Ian', email: 'ian@example.com' }, { name: 'Jane', email: 'jane@example.com' }, { name: 'Kate', email: 'kate@example.com' }, { name: 'Liam', email: 'liam@example.com' }, { name: 'Mandy', email: 'mandy@example.com' }, { name: 'Nina', email: 'nina@example.com' }, { name: 'Oliver', email: 'oliver@example.com' }, { name: 'Peter', email: 'peter@example.com' }, { name: 'Rose', email: 'rose@example.com' }, { name: 'Samantha', email: 'samantha@example.com' }, { name: 'Tom', email: 'tom@example.com' }, { name: 'Victoria', email: 'victoria@example.com' } ];
别的,以下是另一种生成20条静态数据的办法:
const data = Array.from({ length: 20 }, (_, i) => ({ name: `User ${i + 1}`, email: `user${i + 1}@example.com` }));
请让我知道需求回来给你哪一种办法的详细代码。
彩蛋
恭喜你可以耐性的看到最终,作为奖励,我把我复盘之后总结出来的咒语告知你吧,作用特别的好:
我现在想新建个 express + mysql2 的服务,要求:
- 目录结构尽量科学,文件拆分合理
- 用 commonjs 的方式写
- 模仿一个 mysql 的 users 表,有 id,name,email 属性
- express 服务实现对 users 表的增修改查 API
请先列出来目录结构,然后挨个 js 文件展现代码,只需求回来代码,不需求解说任何事情。