如何使用expressjs将数据保存在mongoDB上?

时间:2019-06-13 14:42:29

标签: javascript node.js mongodb express

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

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

我忽略了第一步,并从( Connecting to the Database (连接到数据库))标题开始,但这没用。

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网站上放置的链接

3 个答案:

答案 0 :(得分:2)

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

您分享的文章是不言自明的,但我将为您总结仅数据库部分(我不会深入研究您的代码,也不会使用任何驴子。其余内容取决于您您):

1)首先安装猫鼬。

npm install mongoose

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

2),以便能够访问和使用猫鼬,您需要以节点方式导入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 有什么用?
在快速处理数据库时,迟早会遇到诸如this one之类的错误。
this answer最好地解释了我们毕竟需要一个的原因。 另外,express的最新版本现在具有自己的正文解析器,因此您可以使用app.use(express.json())代替app.use(bodyParser.json())
重要提示:正文解析器必须在您的路线之前。

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的一个原因,请不要忘记将此文件添加到{{1} },以避免此类敏感数据泄露并在线上暴露给其他人。

.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

重要:请确保从MongoDB端(图集)将 IP 白名单白名单,否则会出现连接错误。 在安全下:网络访问-> IP白名单
您可以使用const url = `mongodb+srv://${username}:${password},${myCluster}.mongodb.net/test?retryWrites=true&w=majority` 将所有IP列入白名单。
另外,使用 VPN 时,您的IP也将更改。

4)最后但并非最不重要,连接到数据库后,您需要定义 schema

0.0.0.0/0

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

提示:许多新手经常犯的一个错误是他们忘记使用const Movies = mongoose.model(“Movies”, moviesSchema);
 new

如果要在单独的文件中创建模型(这是最佳做法),则需要修改new mongoose.Schema({...}),以便:

const Movies

不要忘记在单独的js模型文件中添加module.exports = mongoose.model(“Movies”, moviesSchema);

在要使用此模型的任何地方,都需要导入:

const mongoose = require('mongoose');(该路径可能与您的应用不同)

其余的,我的朋友,由您决定。您想对数据库做什么以及如何使用它。

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

答案 1 :(得分:0)

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

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

希望有帮助!

答案 2 :(得分:0)

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

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