【问题标题】:How to save my data on mongoDB by using expressjs?如何使用 expressjs 将我的数据保存在 mongoDB 上?
【发布时间】:2019-10-28 04:45:12
【问题描述】:

我是后端开发的初学者,我有一个名为 (Movie) 的数组。我使用 expressJS 并且我想将数组保存在 MongoDB 上。我将使用 Mongodb 地图集作为我的数据库。感谢您的帮助

我尝试按照此网站上的说明进行操作:
https://medium.com/@lavitr01051977/node-express-js-aea19636a500

我忽略了第一步并从(连接到数据库)标题开始,但它不起作用。

var express = require('express')
var app = express()

app.get('/', (req, res) => {
    res.send('ok')
});
//movie array
const movies = [
    { title: 'Jaws', year: 1975, rating: 8 },
    { title: 'Avatar', year: 2009, rating: 7.8 },
    { title: 'Brazil', year: 1985, rating: 8 },
    { title: 'الإرهاب والكباب‎', year: 1992, rating: 6.2 }
]
//read the array movie
app.get('/movies/read/',(req,res) => {
    res.send({status:200, data:movies})
})
//add elements to array movies
app.get('/movies/add',(req,res) => {
    var t = req.query.title
    var y = req.query.year
    var r = req.query.rating
    if(t == undefined || y == undefined || y.length > 4 || isNaN(y)) {
        res.send({status:403, error:true, message:'you cannot create a movie without providing a title and a year'})
    }
    if (r == "") {
        r = 4
    }
    movies.push({title: t, year: y, rating: r})
        res.send({status:200, data:movies})
    })
//delete elements from array movies
app.get('/movies/delete/:ID',(req,res) => {
    var d = req.params.ID
    if (d > 0 && d < movies.length ) {
        movies.splice(d-1, 1)
        res.send({status:200, message: movies})
    }
    else {
        res.send({status:404, error:true, message:'the movie <ID> does not exist'})
    }
    })      
//update elements from array movies
app.get('/movies/update/:ID',(req,res) => {
    let c = req.params.ID
    let x = req.query.title
    let y = req.query.year
    let z = req.query.rating

    function update(a, b) {
        if(a != undefined || a == "") {
            movies[c-1][b] = a
        }
    }

    if(c > 0 && c < movies.length ) {
        update(x, 'title')
        update(y, 'year')
        update(z, 'rating')
        res.send({status:200, message: movies})
    }
    else {
        res.send({status:404, error:true, message:'the movie <ID> does not exist'})
    }
})

app.listen(3000, () => console.log('listinig on port 3000'))

我希望答案就像我放在 medium.com 网站上的链接一样

【问题讨论】:

  • 你的架构在哪里?
  • 您显示的代码根本不处理任何数据库。考虑通过添加您尝试使用数据库的部分和日志/消息来重写您的问题。

标签: javascript node.js mongodb express


【解决方案1】:

mongoose 是一个便于与 MongoDB 交互的框架。实际上,您基本上不想自己完成所有验证、强制转换和逻辑样板,所以为什么要重新发明轮子。
而且由于您是初学者,因此不要害怕框架。后端和前端的许多领域都有许多有用的框架,可以让您的生活更轻松。

你分享的文章是不言自明的,但我会为你总结只有数据库部分(我不会深入你的代码,没有驴的工作。剩下的取决于你):

1) 首先安装猫鼬。

npm install mongoose

文章有--save,无需再添加,因为“npm install默认将任何指定的包保存到依赖中。”(ref.

2)要能够访问和使用mongoose,需要以node方式导入,即require()

const express = require(‘express’)
const mongoose = require(“mongoose”);
const bodyParser = require(‘body-parser’);  

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true })); 

body-parser 有什么用?
在 express 中处理数据库时,您迟早会遇到像 this one 这样的错误。
我们需要一个的原因在this answer 中得到了最好的解释。
此外,最近版本的 express 现在有自己的 body 解析器,因此您可以使用 app.use(express.json()) 而不是 app.use(bodyParser.json())
重要提示: body-parser 必须在您的路由之前。

3) 使用mongoose.connect(url)

url 参数是您在 MongoDB Atlas 中找到的。 :

位置:集群选项卡 -> 连接 -> 连接您的应用程序 -> 驱动程序 node.js

这给了你,像这样:

mongodb+srv://<user>:<password>@,cluster>.mongodb.net/test?retryWrites=true&w=majority

重要提示:您使用的是您在“数据库访问”选项卡中创建的用户的用户名和密码,而不是您自己的用户名和密码。

您可以设置环境变量以保护敏感和可变数据的安全。但为了简单起见,我更喜欢使用config.js,它通常位于应用程序的根目录中。

您不仅可以保护它们(例如使用.gitignore),还可以轻松修改它们,因为存在可能从一个环境更改为另一个环境的变量,使它们在一个地方可用并且易于查找,而不是寻找他们改变你的应用程序。

对于.env 文件方法,请阅读this article

重要提示:如果您想将代码放在 github 或在线任何地方,这是我们使用 config.js 的原因之一,请不要忘记将此文件添加到 .gitignore 以避免这种情况敏感数据会被泄露并在线暴露给其他人。

config.js 你可以这样做:

exports.username = 'your user';
exports.pass = 'your pass';
exports.myCluster = 'your cluster's name';

然后导入它们:

const { username, pass, myCluster } = require('./config');

提示:您可以使用反引号 (` `) 通过插值轻松插入 const url 的这些变量。

即:

const url = `mongodb+srv://${username}:${password},${myCluster}.mongodb.net/test?retryWrites=true&w=majority`

重要提示:确保将您的 IP 从 MongoDB 端(图集)白名单,否则会出现连接错误。 在安全下:网络访问 -> IP 白名单
您可以使用 0.0.0.0/0 将所有 IP 列入白名单。
此外,当使用 VPN 时,您的 IP 也会发生变化。

4) 最后一点,连接数据库后,你需要定义你的schema

const moviesSchema = new mongoose.Schema({
title: String,
year: Number,
rating: Number
});

const Movies = mongoose.model(“Movies”, moviesSchema);

提示:许多新手常犯的一个错误是他们忘记使用new
new mongoose.Schema({...})

如果你想在一个单独的文件中创建你的模型(这是最佳实践),你需要修改你的const Movies所以:

module.exports = mongoose.model(“Movies”, moviesSchema);

别忘了在那个单独的 js 模型文件中添加 const mongoose = require('mongoose');

并且在任何你想使用这个模型的地方,你导入这样的:

const Movies= require('../models/movies');(路径可能因您的应用而异)

朋友,剩下的就看你自己了。您想对数据库做什么以及如何使用它。

给其他人的注意事项:我在写这篇文章时花了很多时间和精力。请,如果您发现有问题,或者认为您可以添加一些内容,请随时编辑和改进我的答案。

【讨论】:

    【解决方案2】:

    我建议您查看mongoose 框架以使用 NodeJS 与 Mongo 数据库进行交互。

    但是,在您提供的代码中,您并未与任何数据库进行交互。您需要定义一个模式,然后您可以保存一个新文档或对您的集合执行任何其他操作。请按照一些“入门”指南了解如何操作。

    希望对你有帮助!

    【讨论】:

      【解决方案3】:

      我会一步一步解释。注意这个过程应该只运行一次。因此,您应该将此代码添加到单独的模块并运行一次。否则您将继续向数据库添加更多项目。让我们命名这个模块

      movies.js

      //you need to connect to mongodb through mongoose. 
      
      const mongoose = require("mongoose");
      mongoose
        .connect("mongodb://127.0.0.1:27017/movies", { //will create movies db automatically
          useNewUrlParser: true,
          useCreateIndex: true
        })
        .catch(err => {
          console.log(err.message);
          process.exit(1);
        })
        .then(() => {
          console.log("connected");
        });
      
      //next create a schema and model:
      
      const movieSchema = new mongoose.Schema({
        title: String,
        year: Number,
        rating: Number
      });
      const Movie = mongoose.model("Movie", movieSchema);
      
      //create movies array based on `Movie model` so u can use save() method.
      
      const movies = [
        new Movie({ title: "Jaws", year: 1975, rating: 8 }),
        new Movie({ title: "Avatar", year: 2009, rating: 7.8 }),
        new Movie({ title: "Brazil", year: 1985, rating: 8 }),
        new Movie({ title: "الإرهاب والكباب‎", year: 1992, rating: 6.2 })
      ];
      
      //Last step save it.
      
      movies.map(async (p, index) => {
        await p.save((err, result) => {
          if (index === movies.length - 1) {
            console.log("DONE!");
            mongoose.disconnect();
          }
        });
      });
      

      map 是一个数组方法。它遍历数组并将每个项目保存在数组中。保存数组中的每个项目后,我们需要断开与 db 的连接。数组方法需要 2 个参数。 on 是数组中的每个项目,第二个是每个项目的索引。数组中的索引从 0 开始,所以电影数组中最后一项的索引是 3,但数组的长度是 4,所以一旦 4-1=3,这意味着我们保存了数组中的每一项。

      现在运行代码

      node movies.js
      

      【讨论】:

        猜你喜欢
        • 2021-12-18
        • 2016-04-08
        • 2021-02-13
        • 2015-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-27
        相关资源
        最近更新 更多