Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mongoose无法设置“的属性”&引用;若要取消定义,则无论何时尝试创建新条目。即使模式声明正确_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript Mongoose无法设置“的属性”&引用;若要取消定义,则无论何时尝试创建新条目。即使模式声明正确

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

我正在建立一个支持门户网站webiste。在这里我必须记录哪个用户提出了问题。 我使用passport,因此我可以通过req.user.Im获得用户名和_id,使用expressMongoDB Atlas作为我的数据库。我已将我的数据库架构保存在名为models的seaparate文件夹中。 以下是架构文件:

   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