Javascript Mongoose无法设置“的属性”&引用;若要取消定义,则无论何时尝试创建新条目。即使模式声明正确
我正在建立一个支持门户网站webiste。在这里我必须记录哪个用户提出了问题。 我使用passport,因此我可以通过req.user.Im获得用户名和_id,使用express和MongoDB Atlas作为我的数据库。我已将我的数据库架构保存在名为models的seaparate文件夹中。 以下是架构文件:Javascript Mongoose无法设置“的属性”&引用;若要取消定义,则无论何时尝试创建新条目。即使模式声明正确,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正在建立一个支持门户网站webiste。在这里我必须记录哪个用户提出了问题。 我使用passport,因此我可以通过req.user.Im获得用户名和_id,使用express和MongoDB Atlas作为我的数据库。我已将我的数据库架构保存在名为models的seaparate文件夹中。 以下是架构文件: const mongoose=require("mongoose"); const supportSchema=new mongoose.Schema({ type:St
const mongoose=require("mongoose");
const supportSchema=new mongoose.Schema({
type:String,
comment:String,
date:String,
status:String,
author:{
id:{
type:mongoose.Schema.Types.ObjectId,
ref:"User"
},
username:String
}
})
module.exports=mongoose.model("Support",supportSchema);
这里是事情的直截了当的一面:
//posting support to admin
app.post("/admin/support",isLoggedIn,function(req,res){
const data={
type:req.body.type,
comment:req.body.comment,
status:"Pending"
}
Support.create(data,function(err,newsupport){
console.log(req.user);
if(err){
console.log(err);
}else{
//add username and id to ticket
Support.author.id=req.user._id;
Support.author.username=req.user.username;
// save ticket
Support.save();
res.redirect("/home");
}
})
})
正如我们在上面的模式中所看到的,我已经定义了author,在author中我定义了id。每当我试图创建票据时,我都会遇到一个错误。它告诉我“无法设置未定义的属性'id'。
我甚至通过控制台logging req.user(我可以在路由内部访问)进行了交叉检查
我需要app.js中的模式
const Support=require("./models/newsupport");
PS:文件名为newsupport。
我对mongodb连接进行了如下配置:
mongoose
.connect('mongodb+srv://saidarshan:R@mb02501@cluster0-wjhf4.mongodb.net/project?retryWrites=true&w=majority', {
useNewUrlParser: true,
useCreateIndex: true,
useFindAndModify: false,
useUnifiedTopology: true
})
.then(() => {
console.log('Connected to DB');
})
.catch((err) => {
console.log('ERROR', err.message);
});
请帮我解决这个问题。谢谢你我没有看到在你处理
支持
构造函数时,有一个新的变量存在。尝试类似于let newTicket=Support.create(…
,然后设置newTicket.author.id
,等等。我看不出在您处理Support
构造函数时,有什么新的变量可供其使用。尝试类似于let newTicket=Support.create的方法(…
,然后设置newTicket.author.id
,等等。模式声明正确,但您试图在模式本身上保存作者(子文档),而不是实际的文档
Support.author.id=req.user.\u id;
Support.author.username=req.user.username;
//省票
Support.save();
您希望对新创建的文档执行该保存,而不是对架构执行该保存。如下所示:
app.post(“/admin/support”),isLoggedIn,函数(req,res){
常量数据={
类型:req.body.type,
注释:req.body.comment,
状态:“待定”
}
创建(数据、函数(错误、新闻支持){
控制台日志(请求用户);
如果(错误){
控制台日志(err);
}否则{
//将用户名和id添加到票证
newsupport.author.id=req.user.\u id;
newsupport.author.username=req.user.username;
//省票
newsupport.save();
res.redirect(“/主页”);
}
})
})
当然,另一个选项是将所有对象(文档和子文档)组合在一起,并在一次保存中完成所有操作,这样您就可以避免为了执行一项任务而进行两次查询
const数据={
类型:req.body.type,
注释:req.body.comment,
状态:“待定”,
作者:{
id:REQUE.user.\u id,
用户名:req.user.username
}
}
您只需将其传递给
支持。create
,不要再为在已创建的文档上调用save
方法而烦恼。模式声明正确,但您试图在模式本身上保存作者(子文档),而不是实际的文档
Support.author.id=req.user.\u id;
Support.author.username=req.user.username;
//省票
Support.save();
您希望对新创建的文档执行该保存,而不是对架构执行该保存。如下所示:
app.post(“/admin/support”),isLoggedIn,函数(req,res){
常量数据={
类型:req.body.type,
注释:req.body.comment,
状态:“待定”
}
创建(数据、函数(错误、新闻支持){
控制台日志(请求用户);
如果(错误){
控制台日志(err);
}否则{
//将用户名和id添加到票证
newsupport.author.id=req.user.\u id;
newsupport.author.username=req.user.username;
//省票
newsupport.save();
res.redirect(“/主页”);
}
})
})
当然,另一个选项是将所有对象(文档和子文档)组合在一起,并在一次保存中完成所有操作,这样您就可以避免为了执行一项任务而进行两次查询
const数据={
类型:req.body.type,
注释:req.body.comment,
状态:“待定”,
作者:{
id:REQUE.user.\u id,
用户名:req.user.username
}
}
您只需将其传递给
支持。创建,再也不用为在创建的文档上调用保存方法而烦恼。@lonware如果使用了newsupport.author.id=req.user.\u id,则不会创建新的子文档。我不想创建新的子文档。假设我们举一个例子,我点击了post路径,则返回值类似于{type:internetnotworking,comment:something,status:Pending}。此文档在执行Support.author.id之前没有作者字段。我希望id和用户名保存到创建的同一文档中。因此它必须类似于{type:internetnotworking,comment:something,status:Pending,author:{id:12e3ree4556666,username:saidarshan}虽然你的第二种方法成功了,合并了所有文档和子文档。谢谢。但我的疑问是,如果new使用newsupport.author.id,它不会创建一个新文档,就像在代码开始时将id和用户名添加到正在创建的同一文档中一样?不,它绝对不会创建一个新文档。它只是“更新”一个文档。@lonware如果使用了newsupport.author.id=req.user.\u id。这不会创建新的子文档。我不想创建新的子文档。假设我们举一个例子,我点击post路径,值类似于{type:internetnotworking,comment:something,status:Pending}。并且此文档在执行Support.author.id之前没有作者字段。我希望将id和用户名保存到创建的同一文档中。因此它必须类似于{type:internet not wor