我是后端开发的初学者,并且我有一个名为( 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网站上放置的链接
答案 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