布景

最近在研究怎么进行研制提效的事。事务有这么几个特点:

  1. 插件开发,项目多而小,前后端都没那么难;
  2. 后端绝大多数逻辑都是 CRUD,数据结构也很简略;
  3. 前端 UI 用组件库就行,逻辑基本上就是调用 CRUD 的接口或一些 OpenAPI;

那么针对这些特点,优先进步一下后端的开发效率。每次都新建个 Git Repo,搞一套 CI/CD 实在是太重了。所以我盯上了 FaaS,也就是「云函数」。由于本文的要点不是它,所以就不多扩展了,不知道 FaaS 也不会影响后边的内容,只要知道它直接在云服务供给的浏览器 IDE 里面写一个函数,就能生成一个 API 就可以了。当然也少不了「云数据库」,不知道也没关系,仍是不影响后文的了解。

总归,我现在要快速搞一个 CRUD 的项目,来跑一下整个流程。下面来看看我是怎么跟 C 教师对话得到我想要的内容的吧。

总结

由于聊天内容太长了,所以仍是先把总结写在前面吧,把聊天记载放到后边咱们逐渐看。

  • 首要,最终生成的代码肯定是可以跑的,不过参数仍是需求自己修改,所以仍是要有一些编程基础啊;
  • 然后,C 教师是真的能帮码农进步效率,我用的还仅仅 GPT3.5,目前看来作用我现已很满足了;
  • 最终,最最重要的是你得会发问。我也是混了好几天 码农翻身 – ChatGPT 基地 的常识星球,看了很多案例,还自己实践了几天才逐渐掌握窍门的;

小 Tips:告知咱们个小窍门,最好一起开 2 个以上的 tab,一个专门用来查琐细的小问题,一个保持上下文的洁净。很好用。

把我问 C 教师的问题提炼出来,咱们先过一下目,实际上也就 10 个问题而已。剩下那么多内容都是 C 教师答复的:

  1. 你是一个十分有经历的程序员,我想向你询问一些编程方面的问题。你可以用专业名词回复我,而不需求解说它们,我自己回去查。你可以优先答复思路和进程,而不需求立刻就回来给我代码。直到我跟你说“请给我代码”,你再把详细代码展现给我。总归,一次答复当中,请尽量全部都是思路或许全部都是代码,而且信息密度要尽量大。假如你理解了,请回复“理解”
  2. 我想在 mysql 中新建一个测验的用户和测验用的db,要怎么做
  3. 我现已装置了 MySQL,现在请告知我 nodejs 的详细代码
  4. 能不能从新建文件开始,把每一步写的详细一点
  5. npm 包 mysql 和 mysql2 有什么差异?
  6. 那请把上面的比如用 mysql2 再给一遍吧
  7. 请把 morgan 的代码加到上面的 nodejs Demo 代码中,给我展现完好的代码
  8. 上文中 mysql 的 users 表的结构是什么样的
  9. 我现在有了如下服务,请在浏览器的 console 中输入代码,为我创立20条数据,直接给我代码即可 【code】
  10. 请参阅下面已有的 3 条数据的格局,为我生成20条模仿数据,静态数据即可,不需求用代码动态生成:【code】

下面就是比较完好的聊天记载了,咱们逐渐看~~

聊天进程 TL;DR

注:我将一些不成功的发问过滤掉了,留下的都是比较要害的有用的发问。

1. 先给它角色

来自你的音讯:

你是一个十分有经历的程序员,我想向你询问一些编程方面的问题。你可以用专业名词回复我,而不需求解说它们,我自己回去查。你可以优先答复思路和进程,而不需求立刻就回来给我代码。直到我跟你说“请给我代码”,你再把详细代码展现给我。总归,一次答复当中,请尽量全部都是思路或许全部都是代码,而且信息密度要尽量大。假如你理解了,请回复“理解”

来自 ChatGPT 的音讯:

理解。

2. 先把 MySQL 准备好

装置什么的我就省掉了,其实我开了另一个 tab 来问这些琐细的问题,以免主 tab 中的上下文太混乱。

来自你的音讯:

我想在 mysql 中新建一个测验的用户和测验用的db,要怎么做

来自 ChatGPT 的音讯:

你可以依照以下进程在 MySQL 中新建一个测验用户和测验数据库:

  1. 以超级用户(如 root 用户)衔接到 MySQL 服务器,可以运用以下指令衔接:

    mysql -u root -p
    

    然后输入超级用户的暗码进行身份验证。

  2. 创立一个新的数据库,可以运用以下指令:

    CREATE DATABASE testdb;
    

    这将创立一个名为 testdb 的数据库。

  3. 创立一个新的用户,可以运用以下指令:

    CREATE USER 'testuser'@'localhost' IDENTIFIED BY 'mypassword';
    

    这将创立一个名为 testuser 的用户,并运用暗码 mypassword 进行身份验证。其间,'localhost' 表明该用户只能从本地进行衔接。

  4. 将 testuser 用户赋予拜访 testdb 数据库的权限,可以运用以下指令:

    GRANT ALL PRIVILEGES ON testdb.* TO 'testuser'@'localhost';
    

    这将使 testuser 用户拥有拜访 testdb 数据库的一切权限。

  5. 退出 MySQL 客户端,可以运用以下指令:

    EXIT;
    

现在,你现已成功创立了一个名为 testuser 的用户,以及一个名为 testdb 的数据库,而且颁发了 testuser 用户拜访 testdb 数据库的权限。你可以运用以下指令来衔接到 MySQL 服务器并运用 testuser 用户拜访 testdb 数据库:

mysql -u testuser -p testdb

然后输入 testuser 用户的暗码进行身份验证。

3. 接下来让 Nodejs 和 MySQL 连起来

来自你的音讯:

我现已装置了 MySQL,现在请告知我 nodejs 的详细代码

来自 ChatGPT 的音讯:

好的,Node.js 衔接 MySQL 数据库的基本进程如下:

  1. 装置 mysql2 模块

在终端中运转以下指令来装置 mysql2 模块:

npm install mysql2
  1. 在程序中衔接 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 服务:

  1. 首要,打开终端,运用指令行东西创立一个新的文件夹,例如运用以下指令:
mkdir my-node-app
  1. 然后,进入这个文件夹,运用以下指令初始化一个 Node.js 项目:
cd my-node-app
npm init

在运转 npm init 指令时会提示你输入一些项目信息,例如项目称号、描述、作者等等。你可以依据自己的需求自行填写。

  1. 接下来,咱们需求在项目中装置 MySQL 驱动程序,运用以下指令在项目中装置 mysql 模块:
npm install mysql
  1. 装置完成后,在根目录创立一个名为 index.js 的文件,并在文件中引进 mysql 模块:
const mysql = require('mysql');
  1. 接着,咱们需求衔接到 MySQL 数据库。可以先创立一个衔接池,便于咱们重复运用数据库衔接。衔接池可以主动办理衔接的创立和开释,避免频繁地创立和毁掉衔接,进步性能。以下是示例代码:
const pool = mysql.createPool({
  connectionLimit: 10,
  host: 'localhost',
  user: 'root',
  password: 'password', // 这儿需求修改为你自己的暗码
  database: 'my_database' // 这儿需求修改为你自己的数据库名
});

解说一下上面的代码,其间 connectionLimit 用于设置衔接池的最大衔接数,host 用于设置 MySQL 数据库的主机名或 IP 地址,userpassword 分别对应 MySQL 数据库的用户名和暗码,database 对应衔接的数据库名。你需求依据自己的详细情况修改这些装备。

  1. 最终,在回调函数中履行 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 的音讯:

mysqlmysql2 都是 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 数据库,需求修改 hostuserpassworddatabase 这四个参数,分别代表数据库服务器的地址、登录数据库的用户名、暗码和要衔接的数据库的姓名。

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 的服务,要求:

  1. 目录结构尽量科学,文件拆分合理
  2. 用 commonjs 的方式写
  3. 模仿一个 mysql 的 users 表,有 id,name,email 属性
  4. express 服务实现对 users 表的增修改查 API

请先列出来目录结构,然后挨个 js 文件展现代码,只需求回来代码,不需求解说任何事情。

几乎没动手 ChatGPT 就帮我生成了一个 Express + MySQL 服务