大家好。预期“ 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上的应用程序结合起来,我们将进行所有测试。首先,我将给出应用程序文件的结构:
接下来,我将给出一张应用程序中的操作和方法表:创建您的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();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
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;
};
Deal.create = (newDeal, result) => {
sql.query("INSERT INTO TODO SET ?", newDeal, (err, res) => {
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);
});
};
目前为止就这样了。本文的下一部分将要进行,在此我们将完成后写并开始对其进行测试。按照传统,一些有用的链接: