在Express和MySQL上创建自己的CRUD API:第一部分

大家好。预期“ Fullstack JavaScript Developer”课程的开始,我们希望分享一些由我们的自由撰稿人编写的材料。



Express是最流行的Web框架之一,支持路由,中等权重和模板系统。在2020年在没有Express的情况下在Node.js上创建后端是一件相当奇怪的事情,因为Express是在Node.js上构建Web应用程序的事实上的框架。
今天,我们将尝试使用MySQL数据库创建一个简单的CRUD API。经验丰富的Node.js读者会问,MongoDB在哪里,通常与之串联使用。但我马上要说,这篇文章的读者更多是想稍微接触Node.js并减轻过渡到新生态系统的PHP开发人员。我们将使用MySQL。我们将为一个简单的Todo应用程序创建一个API,以防万一有人想要附加到他的待办事项上(即使它是否由React编写也没关系),然后再附加一点并使用它。


“架构”与我们应用的精髓



在我们的应用程序中,可以创建,接收,更新和删除Todo。总的来说,我们将只有一套最少的CRUD函数(创建读取更新删除)。

最后,我们将应用程序与React上的应用程序结合起来,我们将进行所有测试。

首先,我将给出应用程序文件的结构:



接下来,我将给出一张应用程序中的操作和方法表:

方法网址动作
得到/ 交易得到所有案件
得到/交易/ 2获取编号为2的ID
发布/ 交易添加新案例
/交易/ 3更新ID = 3的用户
删除/交易/ 3删除ID = 3的用户
删除/ 交易删除所有用户

创建您的Node.js应用程序

转到您喜欢的目录,启动终端并创建您的应用程序。顺便说一句,从标题可能很清楚应该已经安装了Node.js。如果您尚未这样做,则无法从此处链接中下载

    $ mkdir CRUD_API
    $ cd CRUD_API

接下来,您需要使用npm init初始化我们的应用程序因为 我们的应用程序更像是一个测试和培训的应用程序,我将使用一个命令来填充所有默认数据,以免在细节上浪费时间:

 npm init -y
 

如果是这样,那么package.json您可以动手将数据更改为所需的数据:github存储库,标签,作者等。

然后,我们需要放置应用程序正常运行所需的所有软件包:

  npm i express mysql body-parser --save


如果以后将开发内容发送到github,则应创建一个隐藏文件,.gitignore以免拖拽最重的node_modules 并使自己丢脸我们写:

    touch .gitignore 
    code .gitignore 

我们在此处输入node_modules,稍后在此文件中,您可以输入要稍后在远程服务器上查看的文件夹和文件的名称。

基本Express设定


在项目的根文件夹中,创建一个文件server.js

    const express = require("express");
    const bodyParser = require("body-parser");
    
    const app = express();
    
    //     json
    app.use(bodyParser.json());
    
    //    : application/x-www-form-urlencoded
    app.use(bodyParser.urlencoded({ extended: true }));
    
    //   response - request
    app.get("/", (req, res) => {
      res.json({ message: "    " });
    });
    
    //  ,   
    app.listen(3001, () => {
      console.log("   3001 ");
    });

现在,我们可以使用以下命令启动服务器:

node server.js

我们需要Express来创建我们的api,body-parser可以帮助我们解析请求并创建req.body一个对路由有用的请求

现在,我们的服务器可以执行以下操作:

  • 使用app.use()创建一个可将身体分析器呈现为中间杠杆的Express应用
  • 我们有一个简单的获取,只是测试应用程序
  • 侦听端口3001的所有传入更改

最初,我们的应用程序可以运行,然后您可以创建数据库。

创建您的MySQL数据表

我真的希望本文的读者可以自行下载并安装MySQL和MySQLWorkBranch。接下来,您自己使用最喜欢的名称(在我的情况下为TODO)创建一个方案(DB),然后选择闪电请求并复制/键入以下命令:

    CREATE TABLE IF NOT EXISTS `todo` (
        id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
        text varchar(255) NOT NULL
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

在我们的数据库中,一切都将最少:只有id和案例本身的文本。但是,在另一栏可以描述您案件的紧迫性的情况下,希望它不会引起问题。

配置并连接我们的数据库

让我们建立和配置与数据库的连接。我们将直接在根文件夹中创建一个新的app文件夹,然后db.config.js在该文件夹中创建一个文件,其config内容大致相同,这取决于您在MySQLWorkBranch中的设置。就我而言,该文件将如下所示:

  module.exports = {
    HOST: "localhost",
    USER: "pavel",
    PASSWORD: "",
    DB: "TODO"
  };

之后,创建一个文件夹来描述我们的应用程序/模式模型,然后在其中创建一个模型:

  const mysql = require("mysql");
  const dbConfig = require("../config/db.config.js");
  
  //      
  const connection = mysql.createConnection({
    host: dbConfig.HOST,
    user: dbConfig.USER,
    password: dbConfig.PASSWORD,
    database: dbConfig.DB
  });
  
  //      
  connection.connect(err => {
    if (err) throw error;
    console.log("    ");
  });

  module.exports = connection;
   //  

建立模型

在该文件夹中model,我们创建一个名为的文件deal.model.js如果你有一个问题,什么是一般的模型,你应该阅读等的物品与MVC设计模式熟悉。我将为Deal对象创建一个构造函数,并将连接用于以下CRUD函数:

  • 创建新业务
  • 通过ID查找案例
  • 得到所有案件
  • 能够通过id更新我们的案例
  • 通过ID删除一个案例
  • 完全删除所有案件

总计,我们必须执行以下操作:

  //   
  const Deal = function(deal) {
    this.text = deal.text;
  };
  //    ,        CRUD,      :
  Deal.create = (newDeal, result) => {
    sql.query("INSERT INTO TODO SET ?", newDeal, (err, res) => {
      //   SQL
      if (err) {
        console.log("error: ", err);
        result(err, null);
        //   ,     
        return;
      }
  
      console.log(" ", { id: res.insertId, ...newDeal });
      result(null, { id: res.insertId, ...newDeal });
    });
  };


我将其余代码放置在扰流器中,因为我看不到任何理由将其全部包含在内,因为实际上在这里重复了代码模式,只有sql命令和参数发生了变化:

其余代码
Deal.findById = (dealId, result) => {
sql.query(`SELECT * FROM TODO WHERE id = ${dealId}`, (err, res) => {
if (err) {
console.log(«error: », err);
result(err, null);
return;
}

if (res.length) {
console.log(« : », res[0]);
result(null, res[0]);
return;
}

//
result({ kind: «not_found» }, null);
});
};

Deal.getAll = result => {
sql.query(«SELECT * FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

console.log(«deals: », res);
result(null, res);
});
};

Deal.updateById = (id, deal, result) => {
sql.query(
«UPDATE TODO SET text =? WHERE id = ?»,
[deal.text, id],
(err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

if (res.affectedRows == 0) {
result({ kind: «not_found» }, null);
return;
}

console.log(« », { id: id, ...deal });
result(null, { id: id, ...deal });
}
);
};

Deal.remove = (id, result) => {
sql.query(«DELETE FROM TODO WHERE id = ?», id, (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

if (res.affectedRows == 0) {
// id
result({ kind: «not_found» }, null);
return;
}
console.log(« », id);
result(null, res);
});
};

Deal.removeAll = result => {
sql.query(«DELETE FROM TODO», (err, res) => {
if (err) {
console.log(«error: », err);
result(null, err);
return;
}

console.log(`deleted ${res.affectedRows} deals`);
result(null, res);
});
};



目前为止就这样了。本文的下一部分将要进行,在此我们将完成后写并开始对其进行测试。按照传统,一些有用的链接:


All Articles