使用 nodeJS 和 mongoDB 将字符串推入数据库
Pushing String into database utilizing nodeJS and mongoDB
我是 JS 的新手,我正在利用 MEAN 堆栈创建一个地方,学生可以在其中将 类 添加到他们的用户配置文件中。我的数据库中已经有一个会话存储,因此 "req.user" 将 return 当前登录的用户信息,特别是 "req.user.id" 将 return 当前登录的用户 ID。另外,我已经想出了如何从我的应用程序中搜索我的数据库中的课程。最终,我的目标是当用户发出 post 请求在数据库中搜索时,我还希望将那些 "values" 推入 类 "key"。我提供了两个选项,这两个选项都不会将相应的字符串添加到数据库中。感谢您的帮助!
Search.JS 选项 #1 的一部分
router.post('/', ensureAuthenticated, function (req,res,next) {
var query = {course: req.body.coursename};
db.collection('courses').find(query).toArray()
.then(db.collection('DefaultUser').update({_id: req.user.id}, {$push: {classes: req.body.coursename}}));
res.render('search', {title: 'search'})
});
Search.JS 选项 #2 的一部分
router.post('/', ensureAuthenticated, function(req,res,next) {
var query = {course: req.body.coursename};
db.collection('courses').find(query).toArray((err, results) => {
if (err) {
throw err;
} else {
db.collection('DefaultUser').updateOne({_id: '5c17161d3347e79410ff29ba'}, {
$push: {
classes: req.body.coursename
}
})
console.log(results)
res.render('search', {courses: results, title: 'search'})
}
})
});
一些提示可能会有所帮助:
如果您忘记使用 app.use(express.urlencoded())
来解析发布的数据,req.body
将一无所获。
- 您可以使用
ObjectId('<string>')
(在选项 #2 中)来查找和更新查询,而不仅仅是字符串,因为 mongodb 将 _id
存储为 ObjectId 类型默认。
- 您可以使用
$addToSet
而不是 $push
修饰符来向数组添加唯一元素,或者您可以让一名学生订阅另外两个相同的 class,如果他重复提交表格。
- 在您的代码中,您先在
courses
集合中查找然后更新,但由于您对查找结果未执行任何操作,因此没有必要这样做(空结果不会引发任何错误)。检查数据是否有效是一个很好的做法,如果你想这样做,在这两个选项中,你需要使用 findOne
而不是 find
来确保课程存在,并且 .then(course => {/* check if the course is null and then throws an error */} )
.
我没有你项目的完整代码,所以我只能猜测可能存在上面列出的问题,祝你好运!
我是 JS 的新手,我正在利用 MEAN 堆栈创建一个地方,学生可以在其中将 类 添加到他们的用户配置文件中。我的数据库中已经有一个会话存储,因此 "req.user" 将 return 当前登录的用户信息,特别是 "req.user.id" 将 return 当前登录的用户 ID。另外,我已经想出了如何从我的应用程序中搜索我的数据库中的课程。最终,我的目标是当用户发出 post 请求在数据库中搜索时,我还希望将那些 "values" 推入 类 "key"。我提供了两个选项,这两个选项都不会将相应的字符串添加到数据库中。感谢您的帮助!
Search.JS 选项 #1 的一部分
router.post('/', ensureAuthenticated, function (req,res,next) {
var query = {course: req.body.coursename};
db.collection('courses').find(query).toArray()
.then(db.collection('DefaultUser').update({_id: req.user.id}, {$push: {classes: req.body.coursename}}));
res.render('search', {title: 'search'})
});
Search.JS 选项 #2 的一部分
router.post('/', ensureAuthenticated, function(req,res,next) {
var query = {course: req.body.coursename};
db.collection('courses').find(query).toArray((err, results) => {
if (err) {
throw err;
} else {
db.collection('DefaultUser').updateOne({_id: '5c17161d3347e79410ff29ba'}, {
$push: {
classes: req.body.coursename
}
})
console.log(results)
res.render('search', {courses: results, title: 'search'})
}
})
});
一些提示可能会有所帮助:
-
如果您忘记使用
req.body
将一无所获。- 您可以使用
ObjectId('<string>')
(在选项 #2 中)来查找和更新查询,而不仅仅是字符串,因为 mongodb 将_id
存储为 ObjectId 类型默认。 - 您可以使用
$addToSet
而不是$push
修饰符来向数组添加唯一元素,或者您可以让一名学生订阅另外两个相同的 class,如果他重复提交表格。 - 在您的代码中,您先在
courses
集合中查找然后更新,但由于您对查找结果未执行任何操作,因此没有必要这样做(空结果不会引发任何错误)。检查数据是否有效是一个很好的做法,如果你想这样做,在这两个选项中,你需要使用findOne
而不是find
来确保课程存在,并且.then(course => {/* check if the course is null and then throws an error */} )
.
app.use(express.urlencoded())
来解析发布的数据,我没有你项目的完整代码,所以我只能猜测可能存在上面列出的问题,祝你好运!