dev.to 上的 Node API 教程代码库
将记录存储在数据库中
从数据库检索记录
更新数据库中的记录等
项目
AwesomeNodePostgres
该项目旨在教授如何使用 PostgreSQL 持久化数据,同时使用 NodeJs 创建 API。我们将致力于创建一个课堂应用程序,该 API 目前用于处理查看所有学生、添加学生、编辑学生详细信息、删除学生等功能。欢迎您为该项目做出贡献,并在 README.md 文件中留下如何使用它的说明,从而添加其他功能。
当我们使用“持久化”这个词时,我们指的是什么?在日常英语中,持久化是指“在原因消除后,结果仍然能够持续存在”。在数据库中存储数据的语境中,持久化是指记录在创建过程结束后仍然能够保留的能力。
与其他使用 MongoDB 实现数据持久化的 NodeJS 教程不同,我们将使用 PostgreSQL。此外,为了确保掌握使用 NodeJS 和 PostgreSQL 开发 Restful API 的基础知识,我们将避免使用 ORM(对象关系映射),更多信息请阅读👉此处。
先决条件:
pgAdmin
并启动它,随 PostgreSQL 一起安装。pgAdmin 是 PostgreSQL 的 GUI 管理和开发平台(这意味着它有助于使我们的数据库管理更加轻松和友好)入门:
在本教程中,我们将为类注册表创建一个 API,我们将开始创建和设置我们的数据库。
按照以下说明使用 pgAdmin 创建数据库:1. Double click on the PostgreSQL server
。
2. Right-lick on Login Roles, assuming you have none and select new login role
。
3. Type your preferred Role name, mine is school_reg
。
4. Move to the next tab *Definition* and set your password for this role, mine is school_reg
。
5. Click on *OK* to save
。
6. Right-click on Databases and select New Database
。
7. Type Database name in the space for Name, mine is school_register
。
8. Select owner of Database, here we would select the login role or user we created, remember mine is school_reg
。
9. Click *OK* to save
。
上图说明了上述过程,放大可以看得更清楚:
创建数据库后,我们需要创建表和表关系,用更通俗的术语来说,就是创建模式。目前我们只有一张表,也就是我们自己的student
表,里面保存着学生的基本信息。随着应用程序的扩展,如果我们选择扩展,就需要创建更多表。
项目设置:
我们将首先创建我们的项目文件夹,我将我的文件夹命名为AwesomeNodepostgres
,是的,我知道这很长,您可以自由选择一个更短的名称。
npm init
在命令行中找到项目文件夹后,运行以下命令将项目初始化为 Node 项目。如果您还没有这样做,请参阅上一篇教程来了解如何操作。
完成上述步骤后,您的项目目录应该如下所示,假设您正在使用我最喜欢的代码编辑器vscode。
现在一切都搞定了,我们先来安装一些编写应用程序所需的软件包。本教程需要以下 Node 软件包:
要安装前两个包,请确保您在命令行中处于项目文件夹内。然后运行以下命令:
npm install express pg --save
npm install nodemon --save-dev
--save-dev
这里的意思是保存并仅在开发期间使用 nodemon 作为开发依赖项,因此在生产期间不会使用 nodemon。
现在要建立数据库连接,我们需要创建一个文件夹services
,并在该文件夹内创建一个名为的文件db.js
。
因此services/db.js
,在里面输入以下代码;
const pg = require('pg');
const config = {
user: 'school_reg', //this is the db user credential
database: 'school_register',
password: 'school_reg',
port: 5432,
max: 10, // max number of clients in the pool
idleTimeoutMillis: 30000,
};
const pool = new pg.Pool(config);
pool.on('connect', () => {
console.log('connected to the Database');
});
现在要创建我们的表格,请在上一个代码块下键入以下代码;
const createTables = () => {
const schoolTable = `CREATE TABLE IF NOT EXISTS
students(
id SERIAL PRIMARY KEY,
student_name VARCHAR(128) NOT NULL,
student_age INT NOT NULL,
student_class VARCHAR(128) NOT NULL,
parent_contact VARCHAR(128) NOT NULL,
admission_date VARCHAR(128) NOT NULL
)`;
pool.query(schoolTable)
.then((res) => {
console.log(res);
pool.end();
})
.catch((err) => {
console.log(err);
pool.end();
});
};
要使用此脚本创建我们的表,我们需要找到一种在命令行上运行此代码的方法。我们可以使用另一个名为的包make-runnable
,安装该包;npm install make-runnable --save
,安装后,返回页面底部的代码库,添加以下内容;
pool.on('remove', () => {
console.log('client removed');
process.exit(0);
});
//export pool and createTables to be accessible from an where within the application
module.exports = {
createTables,
pool,
};
require('make-runnable');
现在,为了创建我们的应用,让我们在package.json
文件上编写一个脚本,当从命令行运行时,它会为我们创建一个表。在package.json
文件中找到对象脚本,将对象内部的内容替换为以下代码:
"create": "node ./services/db createTables"
在项目目录中转到命令行并运行;
npm run create
下图显示了执行此操作时发生的情况,并仔细查看在 pgAdmin 应用程序上定位新创建的表的位置。
随着数据库和表的创建完成,我们就可以开始在数据库中存储数据并检索存储的数据了。
在此之前,让我们先创建index.js
文件,其中包含我们的服务器和快速代码,在项目文件夹中创建一个名为的文件index.js
。在我们的文件中输入以下代码index.js
。
const express = require('express');
const app = express();
const port = process.env.PORT || 3000;
// Add route code Here
app.get('/', (req, res) => {
res.send('Welcome to Our SCHOOL API');
});
app.listen(port, () => {
console.log(`We are live at 127.0.0.1:${port}`);
});
scripts
要运行我们的应用程序,让我们在文件中找到的对象上添加两个额外的代码package.json
,在创建之前,删除这两个;
"dev": "nodemon index.js",
"start": "node index.js",
现在运行我们的项目,我们将使用 nodemon 选项,这样无论我们做了什么更改,我们都能注意到。尝试观察当你进行更改并保存时,nodemon 是如何重启服务器的。
服务器启动后,访问服务器监听的链接(127.0.0.1:3000
我的链接已指定)。打开 Postman 应用程序,并使用该链接发出 GET 请求。
现在,让我们创建处理创建学生信息和获取所有学生信息的路由。在index.js
文件的第一个路由之后,添加以下代码,这些代码将分别处理插入学生信息和获取所有学生信息的操作。为了能够将数据插入数据库,我们需要能够选择任何请求主体中提供的值,为此,我们将使用名为body-parser的 Node 包。
npm install body-parser
安装上述软件包后,index.js
在继续我们的路线之前,将以下代码添加到我们的代码中。在下面添加以下内容const app = express();
const bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyparser.urlencoded({extended:true}));
现在让我们继续我们的路线;
app.get('/student', (req, res) => {
pool.connect((err, client, done) => {
const query = 'SELECT * FROM students';
client.query(query, (error, result) => {
done();
if (error) {
res.status(400).json({error})
}
if(result.rows < '1') {
res.status(404).send({
status: 'Failed',
message: 'No student information found',
});
} else {
res.status(200).send({
status: 'Successful',
message: 'Students Information retrieved',
students: result.rows,
});
}
});
});
});
app.post('/student', (req, res) => {
const data = {
name : req.body.studentName,
age : req.body.studentAge,
classroom : req.body.studentClass,
parents : req.body.parentContact,
admission : req.body.admissionDate,
}
pool.connect((err, client, done) => {
const query = 'INSERT INTO students(student_name,student_age, student_class, parent_contact, admission_date) VALUES($1,$2,$3,$4,$5) RETURNING *';
const values = [data.name, data.age, data.classroom, data.parents, data.admission];
client.query(query, values, (error, result) => {
done();
if (error) {
res.status(400).json({error});
}
res.status(202).send({
status: 'SUccessful',
result: result.rows[0],
});
});
});
});
运行你的应用,然后访问 Postman 上的链接,这次127.0.0.1/student
对每个请求交替使用 GET 和 POST 两种方式。如果你不知道如何使用 Postman 进行测试,请查看下面的截图并执行完全相同的操作。
现在运行获取请求,将请求类型更改为 GET,然后单击发送。
Wolla!!! 现在我们的 API 已经可以获取数据并发送到数据库了。
注意:将我们的路由、服务器和快速应用程序放在一个文件中是不好的做法,请在 GitHub 上为该项目存储库加注星标,分叉并提交 PR,以学习如何操作,因为我会继续进行该操作,或者您可以尝试自己进行操作并提交推送请求。
让我们为我们的应用程序添加一条路线,假设我们想要获取特定学生的信息,我们会编写路线,但我希望您根据所学内容编写查询并返回响应。
app.get('/student/:id', (req,res) => {
const id = req.params.id;
res.send(`Student ${id} profile`);
});
当我们向新的端点发出请求时,我们会得到;
因此,请尝试完成代码以从数据库中选择您所引用其 ID 的学生。
以下是承诺的 GitHub Repo,请不要忘记点赞。谢谢。
在下一个教程中,我们将研究如何验证我们的路线,因此如果没有适当的身份验证,用户就无法访问路线。