用nodejs,express和mongodb来分解REST API:#5 MongoDB和Mongoose
#node #法国 #express #mongodb

引入MongoDB和Mongoose

我们将使用MongoDB作为应用程序的后端数据库。您当然可以使用其他解决方案来持续您的应用程序数据,例如在文件中,在关系SQL数据库中或其他类型的存储机制中。在本章中,我们将介绍流行的数据库存储的MongoDB。

mongoDB是一个NOSQL数据库。在我们谈论什么是NOSQL数据库之前,让第一个关于关系数据库的高个子,以便我们可以提供有意义的对比度。如果您以前从未听说过关系数据库,则可以想到关系数据库,例如电子表格结构的数据库,每个条目通常是表中的一行。关系数据库通常由SQL或结构化查询语言控制。流行关系数据库的示例是MySQL,SQL Server和PostgreSQL。

NOSQL数据库通常称为非关系数据库,其中NoSQL的意思是SQL的任何内容(请参阅如何渗透SQL的普及?)。似乎NOSQL是对SQL的抗议活动,但实际上是指不像电子表格那样结构的数据库,即比SQL数据库较不刚性。
那么,为什么要使用Mongo?首先,它很受欢迎,这意味着在线上有很多帮助,其次,自2007年以来就成熟了,并被eBay,Craigslist和Orange等公司使用。

Mongodb的建筑

如前所述,MongoDB的体系结构是一个NOSQL数据库,它以集合和文档的形式存储信息。 MongoDB存储一个或多个收藏。一个集合代表我们应用程序中的一个实体,例如在电子商务应用中,我们需要类别,用户,产品等实体。这些实体中的每个实体将是我们数据库中的一个集合。

然后,一个集合包含文档。文档是包含代表文档的各种相关字段的实体的实例。例如,产品文档将包含名称,图像和价格字段。每个字段都是键值对。文档看起来很像具有各种属性的JSON对象(尽管它们在技术上是二进制JSON或BSON)。收集文档树的示例如下:

Database
    → Products collection
        → Product document {
        price: 26,
        title: "Learning Node",
        description: "Top Notch Development book", expiry date: 27-3-2020
        }
        → Product document
        ...

    → Users collection
        → User document {
        username: "123xyz", contact:
        {
        phone: "123-456-7890", email: "xyz@example.com"
        } }
        → User document ...

机器准备

为了连接到我们的数据库,我们需要在计算机中运行一个。因此,在此处按照说明:Install MongoDB Community Edition — MongoDB Manual

用于可视化

我在我的 mac 上使用Table Plus,但是这是一个很好的多平台 gui 可视化您的蒙哥数据库:Compass

猫鼬

Mongoose提供了一种直接的,基于模式的解决方案,可以对您的应用程序数据进行建模。它包括内置类型的铸造,验证,查询建筑物,业务逻辑挂钩等。

npm install mongoose

然后导入 mongoose

const mongoose = require("mongoose")

不要忘记启用JSON解析,这使您可以访问req

在您的代码编辑器中:

app.use(express.json())

bodyparser 将让 express 解析请求的JSON主体。

连接到我们的数据库

在您的代码编辑器中:

mongoose.connect("mongodb://localhost:27017/test")

Mongoose模型

让我们创建一个模型
- 叫:小猫
- 具有这些属性:
- 名称

const Kitten = mongoose.model("Kitten", { name: String })

仅出于测试的目的,让我们立即创建一个新的小猫称为 le Chat

const kittenToSave = new Kitten({ name: "Le chat" })
kittenToSave.save().then((kitten) => res.json(kitten))

整个文件应该看起来像这样

const express = require("express")
const bodyParser = require("body-parser")
const mongoose = require("mongoose")

const app = express()

app.use(bodyParser.json())

mongoose.connect("mongodb://localhost:27017/test")

const Kitten = mongoose.model("Kitten", { name: String })
kittenToSave.save().then((kitten) => res.json(kitten))

// TO BE COMPLETED...
app.listen(3000)

文件完成

const express = require("express")
const bodyParser = require("body-parser")
const mongoose = require("mongoose")

const app = express()

app.use(bodyParser.json())

mongoose.connect("mongodb://localhost:27017/test")

const Kitten = mongoose.model("Kitten", { name: String })

// Create
app.post("/kittens", (req, res) => {
  const kittenToSave = new Kitten(req.body)
  kittenToSave.save().then((kitten) => res.json(kitten))
})

// Read All
app.get("/kittens", async (req, res) => {
  Kitten.find()
    .then((kittens) => res.json(kittens))
    .catch(() => res.status(404).end())
})

// Read one by ID
app.get("/kittens/:id", async (req, res) => {
  Kitten.findById(req.params.id)
    .then((kitten) => res.json(kitten))
    .catch(() => res.status(404).end())
})

// Update one by ID
app.put("/kittens/:id", async (req, res) => {
  Kitten.findByIdAndUpdate(req.params.id, req.body)
    .then((kitten) => res.json(kitten))
    .catch(() => res.status(404).end())
})

// Delete one by ID
app.delete("/kittens/:id", async (req, res) => {
  Kitten.findOneAndDelete(req.params.id)
    .then((kitten) => res.json(kitten))
    .catch(() => res.status(404).end())
})

app.get("*", (req, res) => {
  res.status(404).end()
})

app.listen(3000)