Как сохранить мои данные на mongoDB с помощью expressjs? - PullRequest
0 голосов
/ 13 июня 2019

Я новичок в разработке Backend, и у меня есть этот массив ( 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

Ответы [ 3 ]

2 голосов
/ 13 июня 2019

mongoose - это структура, облегчающая взаимодействие с MongoDB. На самом деле, вы, по сути, никогда не хотите выполнять все проверки, кастинг и логику самостоятельно, так что зачем изобретать велосипед.
А поскольку вы новичок, не бойтесь фреймворков. Есть много полезных структур для многих областей бэкэнда и внешнего интерфейса, чтобы облегчить вам жизнь.

Статья, которой вы поделились, не требует пояснений, но я подытожу только часть базы данных для вас (я не буду углубляться в ваш код, никакая работа осла. Остальное зависит от вас ):

1) Прежде всего установите мангуст.

npm install mongoose

В статье есть --save, который больше не нужно добавлять, поскольку "npm install сохраняет все указанные пакеты в зависимости по умолчанию." ( ref. )

2) , чтобы иметь возможность доступа и использования mongoose , вам необходимо импортировать его способом узла, то есть require().

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

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

А для чего здесь анализатор тела ?
При работе с базой данных в экспрессе вы рано или поздно столкнетесь с ошибками типа this .
и причина, по которой мы нуждаемся в этом, лучше всего объясняется в этом ответе .
Кроме того, в последних версиях Express теперь имеется собственный анализатор тела, поэтому вы можете использовать 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 файлового подхода прочитайте эту статью .

Важно: на случай, если вы захотите поместить свой код в 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'); <- путь может быть другим для вас! </p>

Совет: Вы можете использовать обратную галочку (` `), чтобы легко вставить эти переменные для 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) последний, но не менее важный , после подключения к базе данных вам необходимо определить вашу схему :

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);

Не забудьте добавить const mongoose = require('mongoose'); в этот отдельный файл модели js.

И куда бы вы ни захотели использовать эту модель, вы импортируете так:

const Movies= require('../models/movies'); (путь может отличаться для вашего приложения)

Остальное, друг мой, зависит от тебя.Что вы хотите сделать со своей базой данных и как ее использовать.

Примечание для других: я уделял этому столько времени и ума, как писал.Пожалуйста, если вы видите что-то не так или думаете, что можете что-то добавить, смело редактируйте и улучшайте мой ответ.

0 голосов
/ 07 июля 2019

Я объясню шаг за шагом. Обратите внимание, что этот процесс должен выполняться только один раз. ТАК ЧТО ВЫ ДОЛЖНЫ ДОБАВИТЬ ЭТОТ КОД В ОТДЕЛЬНЫЙ МОДУЛЬ И ЗАПУСТИТЬ ЕГО РАЗ. в противном случае вы будете добавлять новые элементы в БД. давайте назовем этот модуль

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 - это метод метода method.it перебирает массив и сохраняет каждый элемент в массиве. После сохранения каждого элемента в массиве нам нужно отключиться от БД. Метод массива принимает 2 аргумента. on - каждый элемент массива, второй - индекс каждого элемента. Индекс в массиве начинается с 0, поэтому индекс последнего элемента в массиве movie равен 3, но длина массива равна 4, поэтому один раз 4-1 = 3, что означает, что мы сохранили каждый элемент в массиве.

Теперь запустите код

node movies.js
0 голосов
/ 13 июня 2019

Я бы посоветовал вам взглянуть на mongoose framework для взаимодействия с базой данных Mongo с помощью NodeJS.

Однако в предоставленном вами коде вы не взаимодействуете ни с одной базой данных. Вам нужно будет определить схему, а затем вы можете сохранить новый документ или выполнить любое другое действие с вашей коллекцией. Пожалуйста, следуйте инструкциям «Как начать», как это сделать.

Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...