发布于 2026-01-06 4 阅读
0

使用 MongoDB 构建 Node.js/Express API

使用 MongoDB 构建 Node.js/Express API

在本教程中,我们将创建一个图书集合 API,您将能够创建、读取、更新删除图书,简而言之,就是执行CRUD操作。

本教程面向初学者,因此会提供一些额外的解释和可能有帮助的资源链接。

必备工具:

我们先来配置 MongoDB,这只需要一分钟,之后我们就可以专注于编写代码了:

这一步骤不需要信用卡,而且免费套餐对于我们的项目来说绰绰有余!

登录您的MongoDB帐户并创建一个集群。

你不必选择相同的地区,随意选择适合你的地区即可。在本教程中,选择哪个地区并不重要。
创建集群

创建集群后,请转到“集合”。
由于您可能刚刚创建了帐户,因此该帐户为空,您会看到类似这样的消息:

探索你的数据

点击“添加我的数据”

  • 创建数据库- 如果您的集群中已有数据库。

我将数据库命名为“Books-API”,将集合命名为“Books”。

我们只需要为数据库创建一个新用户,就完成了。
在左侧“安全”下,转到“数据库访问”,然后选择“添加新用户”。

数据库用户

请输入用户名和密码,我这里就用“books-user”这个用户名吧。

对于这种规模的项目来说,用户设置已经足够了,但是如果要进一步扩展,请查看MongoDB 文档并相应地设置用户角色。

恭喜,您已创建数据库和数据库用户。

一切准备就绪,在合适的位置打开终端,让我们开始有趣的部分吧!

首先为我们的项目创建一个文件夹:

mkdir books-api
cd books-api
Enter fullscreen mode Exit fullscreen mode

现在初始化package.json

npm init
Enter fullscreen mode Exit fullscreen mode

系统会要求您输入软件包名称、版本描述等信息,您可以按回车键保留所有默认值。

接下来,我们将安装所有必需的依赖项:

npm install express mongoose cors dotenv --save
Enter fullscreen mode Exit fullscreen mode

还有一个名为 nodemon 的“开发”依赖项,它会在我们保存更改时自动为我们重启服务器。

npm install --save-dev nodemon
Enter fullscreen mode Exit fullscreen mode

用你喜欢的文本编辑器打开项目——我推荐VSC。

首先,我们创建一个.gitignore文件,并将以下内容粘贴到其中:

# Dependency directories
node_modules/
jspm_packages/

# dotenv environment variables file
.env
.env.test
Enter fullscreen mode Exit fullscreen mode

*.gitignore 文件的作用正如其名,它会在我们将项目推送到 Git 时忽略某些文件夹和文件。在本例中,我们希望忽略node_modules 文件夹.env文件。

在终端中输入以下命令。

git init
Enter fullscreen mode Exit fullscreen mode

初始化 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}`);
});
Enter fullscreen mode Exit fullscreen mode

在终端中运行该应用程序:

node app.js
Enter fullscreen mode Exit fullscreen mode

服务器应该已经启动并运行,你应该能Server running on port: 5000在终端中看到相关信息。

在浏览器中,如果我们访问http://localhost:5000/该页面,就会看到这条消息。Cannot GET /

让我们来解决这个问题,在app.js 文件中添加以下代码行:

app.get('/', (req, res) => {
    res.send("Hello World!")
})
Enter fullscreen mode Exit fullscreen mode

我们需要保存文件并重启服务器。在终端中按终止键ctrl + c结束服务器,然后node app.js再次运行命令。

刷新页面(http://localhost:5000/),你应该会看到Hello World!

我们的服务器运行正常,可以开始实现模型、路由和控制器了。但是,如果不用每次修改后都重启服务器并重新运行,那就方便多了。这时,我们的开发依赖项nodemon就能派上用场了。
它会自动重启服务器,我们只需要运行一次就不用管了。听起来不错!

package.json 文件的scripts 部分添加以下代码"dev": "nodemon app.js",内容应如下所示:

"scripts": {
  "dev": "nodemon app.js"
}
Enter fullscreen mode Exit fullscreen mode

现在我们可以npm run dev在终端中运行,它应该看起来像这样:
节点守护程序

app.js中。

删除此项:

app.get('/', (req, res) => {
    res.send("Hello World!")
})
Enter fullscreen mode Exit fullscreen mode

然后像这样导入我们的依赖项:

const mongoose = require("mongoose");
const cors = require("cors");
Enter fullscreen mode Exit fullscreen mode

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 }
);
Enter fullscreen mode Exit fullscreen mode

将 替换<password>为您的密码(您在 MongoDB 上创建用户时使用的密码),并将<dbname>替换为books

这是设置我们系统的绝佳时机。我们通过在项目根目录下dotenv创建一个名为 `.js` 的文件,并添加以下代码来实现:.env

DB_USER=db_user
DB_PASS=db_pass
Enter fullscreen mode Exit fullscreen mode

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 }
);
Enter fullscreen mode Exit fullscreen mode

现在我们需要添加 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}`);
});
Enter fullscreen mode Exit fullscreen mode

在项目根目录下创建controllersmodelsroutes文件夹。

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);
Enter fullscreen mode Exit fullscreen mode

这是我们的图书模式。

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!");
  });
};
Enter fullscreen mode Exit fullscreen mode

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;
Enter fullscreen mode Exit fullscreen mode

服务器运行后,打开 Insomnia(或 Postman)。

创建一个新的 POST 请求,并在请求体中选择“表单 URL 编码”,然后输入所需的字段。您的请求应该类似于这样:

req-post-create-book

现在让我们检查一下数据库,确认它是否确实已创建。

mongo-确认创建

好了,我们的第一条路线完成了。

现在我们需要实现其余的功能。

通过 ID 获取书籍

book.routes.js 文件中添加以下内容:

router.get("/:id", book_controller.book_details);
Enter fullscreen mode Exit fullscreen mode

book.controller.js中

exports.book_details = (req, res) => {
  Book.findById(req.params.id, (err, book) => {
    if (err) return next(err);
    res.send(book);
  });
};
Enter fullscreen mode Exit fullscreen mode

在 Insomnia 中保存并创建一个新的 GET 请求,例如:
GET,http://localhost:5000/books/book_id其中book_idid 是您可以从 MongoDB Cloud 获取的数据库中的 ID。
请求将类似于这样:

获取书籍 ID

获取所有书籍

将路由添加到book.routes.js 中

router.get("/", book_controller.all_books);
Enter fullscreen mode Exit fullscreen mode

book.controller.js中

exports.all_books = (req, res) => {
  Book.find({}, (err, book) => {
    if (err) return next(err);
    res.json(book);
  });
};
Enter fullscreen mode Exit fullscreen mode

保存并测试我们的路由,在 Insomnia 中创建一个 GET 请求http://localhost:5000/books,我们应该会收到收藏集中的所有书籍,例如:

获取全部

更新手册

将路由添加到book.routes.js 中

router.put("/:id/update", book_controller.book_update);
Enter fullscreen mode Exit fullscreen mode

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.");
  });
};
Enter fullscreen mode Exit fullscreen mode

为了测试路由,我们将在 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);
Enter fullscreen mode Exit fullscreen mode

book.controller.js中

exports.book_delete = (req, res) => {
  Book.findByIdAndRemove(req.params.id, (err) => {
    if (err) return next(err);
    res.send("Book Deleted");
  });
};
Enter fullscreen mode Exit fullscreen mode

在 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