使用 MongoDB 构建 Node.js/Express API
在本教程中,我们将创建一个图书集合 API,您将能够创建、读取、更新和删除图书,简而言之,就是执行CRUD操作。
本教程面向初学者,因此会提供一些额外的解释和可能有帮助的资源链接。
必备工具:
- Node.js
- 失眠
- MongoDB - 创建免费帐户(无需安装)
- Visual Studio Code或任何你喜欢的文本编辑器。
我们先来配置 MongoDB,这只需要一分钟,之后我们就可以专注于编写代码了:
这一步骤不需要信用卡,而且免费套餐对于我们的项目来说绰绰有余!
登录您的MongoDB帐户并创建一个集群。
你不必选择相同的地区,随意选择适合你的地区即可。在本教程中,选择哪个地区并不重要。
创建集群后,请转到“集合”。
由于您可能刚刚创建了帐户,因此该帐户为空,您会看到类似这样的消息:
点击“添加我的数据”
- 创建数据库- 如果您的集群中已有数据库。
我将数据库命名为“Books-API”,将集合命名为“Books”。
我们只需要为数据库创建一个新用户,就完成了。
在左侧“安全”下,转到“数据库访问”,然后选择“添加新用户”。
请输入用户名和强密码,我这里就用“books-user”这个用户名吧。
对于这种规模的项目来说,用户设置已经足够了,但是如果要进一步扩展,请查看MongoDB 文档并相应地设置用户角色。
恭喜,您已创建数据库和数据库用户。
一切准备就绪,在合适的位置打开终端,让我们开始有趣的部分吧!
首先为我们的项目创建一个文件夹:
mkdir books-api
cd books-api
现在初始化package.json
npm init
系统会要求您输入软件包名称、版本描述等信息,您可以按回车键保留所有默认值。
接下来,我们将安装所有必需的依赖项:
npm install express mongoose cors dotenv --save
还有一个名为 nodemon 的“开发”依赖项,它会在我们保存更改时自动为我们重启服务器。
npm install --save-dev nodemon
用你喜欢的文本编辑器打开项目——我推荐VSC。
首先,我们创建一个.gitignore文件,并将以下内容粘贴到其中:
# Dependency directories
node_modules/
jspm_packages/
# dotenv environment variables file
.env
.env.test
*.gitignore 文件的作用正如其名,它会在我们将项目推送到 Git 时忽略某些文件夹和文件。在本例中,我们希望忽略node_modules 文件夹和.env文件。
在终端中输入以下命令。
git init
初始化 Git。
你不一定要使用 Git,但我出于实际原因推荐它,而且你最终无论如何都需要学习如何使用它。
创建一个名为app.js 的文件,并输入以下内容:
const express = require("express");
const app = express();
const port = process.env.PORT || 5000;
app.listen(port, () => {
console.log(`Server running on port: ${port}`);
});
在终端中运行该应用程序:
node app.js
服务器应该已经启动并运行,你应该能Server running on port: 5000在终端中看到相关信息。
在浏览器中,如果我们访问http://localhost:5000/该页面,就会看到这条消息。Cannot GET /
让我们来解决这个问题,在app.js 文件中添加以下代码行:
app.get('/', (req, res) => {
res.send("Hello World!")
})
我们需要保存文件并重启服务器。在终端中按终止键ctrl + c结束服务器,然后node app.js再次运行命令。
刷新页面(http://localhost:5000/),你应该会看到Hello World!。
我们的服务器运行正常,可以开始实现模型、路由和控制器了。但是,如果不用每次修改后都重启服务器并重新运行,那就方便多了。这时,我们的开发依赖项nodemon就能派上用场了。
它会自动重启服务器,我们只需要运行一次就不用管了。听起来不错!
在package.json 文件的scripts 部分添加以下代码"dev": "nodemon app.js",内容应如下所示:
"scripts": {
"dev": "nodemon app.js"
}
现在我们可以npm run dev在终端中运行,它应该看起来像这样:
在app.js中。
删除此项:
app.get('/', (req, res) => {
res.send("Hello World!")
})
然后像这样导入我们的依赖项:
const mongoose = require("mongoose");
const cors = require("cors");
connect我们需要连接 MongoDB,首先打开浏览器,访问云端的集群,然后获取连接字符串,点击按钮即可。
复制连接字符串,然后返回VSC 中的app.js 文件。
输入以下命令创建与 MongoDB 的连接:
请务必使用从 MongoDB Cloud 复制的连接字符串。使用下面的连接字符串将无法正常工作。
mongoose.connect(
`mongodb+srv://books-user:<password>@cluster0.qvwwc.gcp.mongodb.net/<dbname>?retryWrites=true&w=majority`,
{ useNewUrlParser: true, useUnifiedTopology: true }
);
将 替换<password>为您的密码(您在 MongoDB 上创建用户时使用的密码),并将<dbname>替换为books。
这是设置我们系统的绝佳时机。我们通过在项目根目录下dotenv创建一个名为 `.js` 的文件,并添加以下代码来实现:.env
DB_USER=db_user
DB_PASS=db_pass
db_user您的数据库用户名和db_pass数据库密码分别是什么?
现在回到app.js 文件中,在连接字符串中,我们将替换用户名和密码,它看起来会像这样:
别忘了添加和配置。
dotenv
require("dotenv").config();
mongoose.connect(
`mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@cluster0.qvwwc.gcp.mongodb.net/books?retryWrites=true&w=majority`,
{ useNewUrlParser: true, useUnifiedTopology: true }
);
现在我们需要添加 CORS 和图书路由。
最终的app.js 文件将如下所示:
const express = require("express");
const mongoose = require("mongoose");
const cors = require("cors");
const book = require("./routes/book.routes");
const app = express();
const port = process.env.PORT || 5000;
require("dotenv").config();
mongoose.connect(
`mongodb+srv://${process.env.DB_USER}:${process.env.DB_PASS}@cluster0.qvwwc.gcp.mongodb.net/books?retryWrites=true&w=majority`,
{ useNewUrlParser: true, useUnifiedTopology: true }, () => {
console.log('MongoDB Connected')
}
);
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
app.use("/books", book);
app.listen(port, () => {
console.log(`Server running on port: ${port}`);
});
在项目根目录下创建controllers、models和routes文件夹。
model我们将在该文件夹中创建一个名为book.model.js的文件,并在其中输入以下内容:
const mongoose = require('mongoose')
const Schema = mongoose.Schema;
const BookSchema = new Schema ({
title: {type: String, required: true, max: 100},
author: {type: String, required: true},
year: {type: Number, required:true},
});
module.exports = mongoose.model("Book", BookSchema);
这是我们的图书模式。
controllers让我们在文件夹中创建一个名为book.controller.js 的新文件,并输入以下内容:
const Book = require("../models/book.model");
exports.book_create = (req, res, next) => {
const book = new Book({
title: req.body.title,
author: req.body.author,
year: req.body.year,
});
book.save((err) => {
if (err) {
return next(err);
}
res.send("Book created successfully!");
});
};
在routes文件夹中创建一个名为book.routes.js 的新文件,并输入以下代码:
const express = require("express");
const router = express.Router();
const book_controller = require("../controllers/book.controller");
router.post("/create", book_controller.book_create);
module.exports = router;
服务器运行后,打开 Insomnia(或 Postman)。
创建一个新的 POST 请求,并在请求体中选择“表单 URL 编码”,然后输入所需的字段。您的请求应该类似于这样:
现在让我们检查一下数据库,确认它是否确实已创建。
好了,我们的第一条路线完成了。
现在我们只需要实现其余的功能。
通过 ID 获取书籍
在book.routes.js 文件中添加以下内容:
router.get("/:id", book_controller.book_details);
在book.controller.js中
exports.book_details = (req, res) => {
Book.findById(req.params.id, (err, book) => {
if (err) return next(err);
res.send(book);
});
};
在 Insomnia 中保存并创建一个新的 GET 请求,例如:
GET,http://localhost:5000/books/book_id其中book_idid 是您可以从 MongoDB Cloud 获取的数据库中的 ID。
请求将类似于这样:
获取所有书籍
将路由添加到book.routes.js 中:
router.get("/", book_controller.all_books);
在book.controller.js中
exports.all_books = (req, res) => {
Book.find({}, (err, book) => {
if (err) return next(err);
res.json(book);
});
};
保存并测试我们的路由,在 Insomnia 中创建一个 GET 请求http://localhost:5000/books,我们应该会收到收藏集中的所有书籍,例如:
更新手册
将路由添加到book.routes.js 中:
router.put("/:id/update", book_controller.book_update);
在book.controller.js中
exports.book_update = (req, res) => {
Book.findByIdAndUpdate(req.params.id, { $set: req.body }, (err, book) => {
if (err) return next(err);
res.send("Book Udpated.");
});
};
为了测试路由,我们将在 Insomnia 中创建另一个请求,这次是 PUT 请求,如下所示:
PUT。http://localhost:5000/books/id_of_book_to_be_updated/update
请求体应使用表单 URL 编码。
我们还有一条路线,那就是:
删除书籍
将路由添加到book.routes.js 中:
router.delete("/:id/delete", book_controller.book_delete);
在book.controller.js中
exports.book_delete = (req, res) => {
Book.findByIdAndRemove(req.params.id, (err) => {
if (err) return next(err);
res.send("Book Deleted");
});
};
在 Insomnia 中创建另一个类似这样的请求:
删除http://localhost:5000/books/id_of_book_to_be_deleted/delete
为了确认这一点,我们可以检查我们的 MongoDB 云数据库,我们会发现一切确实都按预期运行!
如果你觉得这很有趣,并且想看到更多类似的教程,请在下面的评论区或推特上告诉我。
文章来源:https://dev.to/edin/build-a-node-js-express-api-with-mongodb-4eea








