Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/23.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 CastError:转换为ObjectId的值失败…`at path";“问题”;_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript CastError:转换为ObjectId的值失败…`at path";“问题”;

Javascript CastError:转换为ObjectId的值失败…`at path";“问题”;,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我目前正在使用MongoDB/Mongoose构建一个节点后端,我似乎在将数据绑定在一起时遇到了一些问题。具体来说,我希望所有用户都能够提交一份表格(问题表格),然后将其添加到“问题”集合中。除了添加到questions集合之外,我还需要在user对象内部直接存储对用户回答的所有问题的引用 下面你可以查看我的代码。每当我向/questions发出POST请求时,它就会抛出这个错误。我应该注意的是,它成功地将文档添加到问题集合中,每个问题都包含创建它的用户的ID,但主要问题是用户的问题数组没有得到

我目前正在使用MongoDB/Mongoose构建一个节点后端,我似乎在将数据绑定在一起时遇到了一些问题。具体来说,我希望所有用户都能够提交一份表格(问题表格),然后将其添加到“问题”集合中。除了添加到questions集合之外,我还需要在user对象内部直接存储对用户回答的所有问题的引用

下面你可以查看我的代码。每当我向
/questions
发出
POST
请求时,它就会抛出这个错误。我应该注意的是,它成功地将文档添加到问题集合中,每个问题都包含创建它的用户的ID,但主要问题是用户的
问题
数组没有得到更新以包含已提交问题的ID值。

Models/User.js

const mongoose = require('mongoose'),  
      Schema = mongoose.Schema,
      bcrypt = require('bcrypt-nodejs');


const UserSchema = new Schema({  
  email: {
    type: String,
    lowercase: true,
    unique: true,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  profile: {
    firstName: { type: String },
    lastName: { type: String }
  },
  questions: [
  {
      type: Schema.Types.ObjectId,
      ref: 'Question'
  }
],
  role: {
    type: String,
    enum: ['Member', 'Client', 'Owner', 'Admin'],
    default: 'Member'
  },
  resetPasswordToken: { type: String },
  resetPasswordExpires: { type: Date }
},
{
  timestamps: true
});

/** Pre-save of user to database, 
    hash password if password is modified or new 
*/
module.exports = mongoose.model('User', UserSchema);
const mongoose = require('mongoose'),  
      Schema = mongoose.Schema;

// Schema defines how questions will be stored in MongoDB
const QuestionSchema = new Schema({
  questionString: String,
  answer: Boolean,
  _createdBy : [
  {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
  }
],
},{
  //user timestamps to save date created as .createdAt   
  timestamps: true
});


module.exports = mongoose.model('Question', QuestionSchema);
const jwt = require('jsonwebtoken'),  
      crypto = require('crypto'),
      Question = require('../models/question'),
            User = require('../models/user'),
      config = require('../config/main');


function setQuestionInfo(request) {  
  return {
    _id: request._id,
    questionString: request.questionString,
    answer: request.answer,
    user: request.user
  }
}

exports.addQuestion = function(req, res, next) {  

User.findById(req.user.id, (err, user) => {
if (err) throw new Error(err);

// We create an object containing the data from our post request
  const newQuestion = {
    questionString: req.body.questionString,
    answer: req.body.answer,
    // in the author field we add our current user id as a reference
    _createdBy: req.user._id
  };

  // we create our new post in our database
  Question.create(newQuestion, (err, question) => {
      if (err) {
        res.redirect('/');
        throw new Error(err);
      }

      // we insert our newQuestion in our posts field corresponding to the user we found in our database call
      user.questions.push(newQuestion);
      // we save our user with our new data (our new post).
      user.save((err) => {
        return res.send('sucess!');
      });
    })
  });
}
module.exports = function(app) {
  // Initializing route groups
  const apiRoutes = express.Router(),
        userRoutes = express.Router(),
        authRoutes = express.Router(),
        questionRoutes = express.Router();

  //=========================
  // Auth Routes
  //=========================

  /** ROUTES BELOW WORK FINE -- ONLY DEALS WITH POST TO /questions
   * 


  app.use middle ware sets /auth as auth route (everything goes through /api/auth)
  apiRoutes.use('/auth', authRoutes);
  apiRoutes.get('/dashboard', requireAuth, function(req, res) {  
    res.send('It worked! User id is: ' + req.user._id + '.');
  });


  // Set user routes as a subgroup/middleware to apiRoutes
  apiRoutes.use('/user', userRoutes);

  // View user profile route
  userRoutes.get('/:userId', requireAuth, UserController.viewProfile);

  // Test protected route
  apiRoutes.get('/protected', requireAuth, (req, res) => {
    res.send({ content: 'The protected test route is functional!' });
  });
  // Registration route
  authRoutes.post('/register', AuthenticationController.register);
  // Login route
  authRoutes.post('/login', requireLogin, AuthenticationController.login);
  */

  // Problem Area --> Making POST req to /questions
  apiRoutes.post('/questions', requireAuth, QuestionController.addQuestion);

  // Set url for API group routes
  app.use('/api', apiRoutes);
};
模型/Question.js

const mongoose = require('mongoose'),  
      Schema = mongoose.Schema,
      bcrypt = require('bcrypt-nodejs');


const UserSchema = new Schema({  
  email: {
    type: String,
    lowercase: true,
    unique: true,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  profile: {
    firstName: { type: String },
    lastName: { type: String }
  },
  questions: [
  {
      type: Schema.Types.ObjectId,
      ref: 'Question'
  }
],
  role: {
    type: String,
    enum: ['Member', 'Client', 'Owner', 'Admin'],
    default: 'Member'
  },
  resetPasswordToken: { type: String },
  resetPasswordExpires: { type: Date }
},
{
  timestamps: true
});

/** Pre-save of user to database, 
    hash password if password is modified or new 
*/
module.exports = mongoose.model('User', UserSchema);
const mongoose = require('mongoose'),  
      Schema = mongoose.Schema;

// Schema defines how questions will be stored in MongoDB
const QuestionSchema = new Schema({
  questionString: String,
  answer: Boolean,
  _createdBy : [
  {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
  }
],
},{
  //user timestamps to save date created as .createdAt   
  timestamps: true
});


module.exports = mongoose.model('Question', QuestionSchema);
const jwt = require('jsonwebtoken'),  
      crypto = require('crypto'),
      Question = require('../models/question'),
            User = require('../models/user'),
      config = require('../config/main');


function setQuestionInfo(request) {  
  return {
    _id: request._id,
    questionString: request.questionString,
    answer: request.answer,
    user: request.user
  }
}

exports.addQuestion = function(req, res, next) {  

User.findById(req.user.id, (err, user) => {
if (err) throw new Error(err);

// We create an object containing the data from our post request
  const newQuestion = {
    questionString: req.body.questionString,
    answer: req.body.answer,
    // in the author field we add our current user id as a reference
    _createdBy: req.user._id
  };

  // we create our new post in our database
  Question.create(newQuestion, (err, question) => {
      if (err) {
        res.redirect('/');
        throw new Error(err);
      }

      // we insert our newQuestion in our posts field corresponding to the user we found in our database call
      user.questions.push(newQuestion);
      // we save our user with our new data (our new post).
      user.save((err) => {
        return res.send('sucess!');
      });
    })
  });
}
module.exports = function(app) {
  // Initializing route groups
  const apiRoutes = express.Router(),
        userRoutes = express.Router(),
        authRoutes = express.Router(),
        questionRoutes = express.Router();

  //=========================
  // Auth Routes
  //=========================

  /** ROUTES BELOW WORK FINE -- ONLY DEALS WITH POST TO /questions
   * 


  app.use middle ware sets /auth as auth route (everything goes through /api/auth)
  apiRoutes.use('/auth', authRoutes);
  apiRoutes.get('/dashboard', requireAuth, function(req, res) {  
    res.send('It worked! User id is: ' + req.user._id + '.');
  });


  // Set user routes as a subgroup/middleware to apiRoutes
  apiRoutes.use('/user', userRoutes);

  // View user profile route
  userRoutes.get('/:userId', requireAuth, UserController.viewProfile);

  // Test protected route
  apiRoutes.get('/protected', requireAuth, (req, res) => {
    res.send({ content: 'The protected test route is functional!' });
  });
  // Registration route
  authRoutes.post('/register', AuthenticationController.register);
  // Login route
  authRoutes.post('/login', requireLogin, AuthenticationController.login);
  */

  // Problem Area --> Making POST req to /questions
  apiRoutes.post('/questions', requireAuth, QuestionController.addQuestion);

  // Set url for API group routes
  app.use('/api', apiRoutes);
};
Controller/QuestionController.js

const mongoose = require('mongoose'),  
      Schema = mongoose.Schema,
      bcrypt = require('bcrypt-nodejs');


const UserSchema = new Schema({  
  email: {
    type: String,
    lowercase: true,
    unique: true,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  profile: {
    firstName: { type: String },
    lastName: { type: String }
  },
  questions: [
  {
      type: Schema.Types.ObjectId,
      ref: 'Question'
  }
],
  role: {
    type: String,
    enum: ['Member', 'Client', 'Owner', 'Admin'],
    default: 'Member'
  },
  resetPasswordToken: { type: String },
  resetPasswordExpires: { type: Date }
},
{
  timestamps: true
});

/** Pre-save of user to database, 
    hash password if password is modified or new 
*/
module.exports = mongoose.model('User', UserSchema);
const mongoose = require('mongoose'),  
      Schema = mongoose.Schema;

// Schema defines how questions will be stored in MongoDB
const QuestionSchema = new Schema({
  questionString: String,
  answer: Boolean,
  _createdBy : [
  {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
  }
],
},{
  //user timestamps to save date created as .createdAt   
  timestamps: true
});


module.exports = mongoose.model('Question', QuestionSchema);
const jwt = require('jsonwebtoken'),  
      crypto = require('crypto'),
      Question = require('../models/question'),
            User = require('../models/user'),
      config = require('../config/main');


function setQuestionInfo(request) {  
  return {
    _id: request._id,
    questionString: request.questionString,
    answer: request.answer,
    user: request.user
  }
}

exports.addQuestion = function(req, res, next) {  

User.findById(req.user.id, (err, user) => {
if (err) throw new Error(err);

// We create an object containing the data from our post request
  const newQuestion = {
    questionString: req.body.questionString,
    answer: req.body.answer,
    // in the author field we add our current user id as a reference
    _createdBy: req.user._id
  };

  // we create our new post in our database
  Question.create(newQuestion, (err, question) => {
      if (err) {
        res.redirect('/');
        throw new Error(err);
      }

      // we insert our newQuestion in our posts field corresponding to the user we found in our database call
      user.questions.push(newQuestion);
      // we save our user with our new data (our new post).
      user.save((err) => {
        return res.send('sucess!');
      });
    })
  });
}
module.exports = function(app) {
  // Initializing route groups
  const apiRoutes = express.Router(),
        userRoutes = express.Router(),
        authRoutes = express.Router(),
        questionRoutes = express.Router();

  //=========================
  // Auth Routes
  //=========================

  /** ROUTES BELOW WORK FINE -- ONLY DEALS WITH POST TO /questions
   * 


  app.use middle ware sets /auth as auth route (everything goes through /api/auth)
  apiRoutes.use('/auth', authRoutes);
  apiRoutes.get('/dashboard', requireAuth, function(req, res) {  
    res.send('It worked! User id is: ' + req.user._id + '.');
  });


  // Set user routes as a subgroup/middleware to apiRoutes
  apiRoutes.use('/user', userRoutes);

  // View user profile route
  userRoutes.get('/:userId', requireAuth, UserController.viewProfile);

  // Test protected route
  apiRoutes.get('/protected', requireAuth, (req, res) => {
    res.send({ content: 'The protected test route is functional!' });
  });
  // Registration route
  authRoutes.post('/register', AuthenticationController.register);
  // Login route
  authRoutes.post('/login', requireLogin, AuthenticationController.login);
  */

  // Problem Area --> Making POST req to /questions
  apiRoutes.post('/questions', requireAuth, QuestionController.addQuestion);

  // Set url for API group routes
  app.use('/api', apiRoutes);
};
Router.js

const mongoose = require('mongoose'),  
      Schema = mongoose.Schema,
      bcrypt = require('bcrypt-nodejs');


const UserSchema = new Schema({  
  email: {
    type: String,
    lowercase: true,
    unique: true,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  profile: {
    firstName: { type: String },
    lastName: { type: String }
  },
  questions: [
  {
      type: Schema.Types.ObjectId,
      ref: 'Question'
  }
],
  role: {
    type: String,
    enum: ['Member', 'Client', 'Owner', 'Admin'],
    default: 'Member'
  },
  resetPasswordToken: { type: String },
  resetPasswordExpires: { type: Date }
},
{
  timestamps: true
});

/** Pre-save of user to database, 
    hash password if password is modified or new 
*/
module.exports = mongoose.model('User', UserSchema);
const mongoose = require('mongoose'),  
      Schema = mongoose.Schema;

// Schema defines how questions will be stored in MongoDB
const QuestionSchema = new Schema({
  questionString: String,
  answer: Boolean,
  _createdBy : [
  {
      type: mongoose.Schema.Types.ObjectId,
      ref: 'User'
  }
],
},{
  //user timestamps to save date created as .createdAt   
  timestamps: true
});


module.exports = mongoose.model('Question', QuestionSchema);
const jwt = require('jsonwebtoken'),  
      crypto = require('crypto'),
      Question = require('../models/question'),
            User = require('../models/user'),
      config = require('../config/main');


function setQuestionInfo(request) {  
  return {
    _id: request._id,
    questionString: request.questionString,
    answer: request.answer,
    user: request.user
  }
}

exports.addQuestion = function(req, res, next) {  

User.findById(req.user.id, (err, user) => {
if (err) throw new Error(err);

// We create an object containing the data from our post request
  const newQuestion = {
    questionString: req.body.questionString,
    answer: req.body.answer,
    // in the author field we add our current user id as a reference
    _createdBy: req.user._id
  };

  // we create our new post in our database
  Question.create(newQuestion, (err, question) => {
      if (err) {
        res.redirect('/');
        throw new Error(err);
      }

      // we insert our newQuestion in our posts field corresponding to the user we found in our database call
      user.questions.push(newQuestion);
      // we save our user with our new data (our new post).
      user.save((err) => {
        return res.send('sucess!');
      });
    })
  });
}
module.exports = function(app) {
  // Initializing route groups
  const apiRoutes = express.Router(),
        userRoutes = express.Router(),
        authRoutes = express.Router(),
        questionRoutes = express.Router();

  //=========================
  // Auth Routes
  //=========================

  /** ROUTES BELOW WORK FINE -- ONLY DEALS WITH POST TO /questions
   * 


  app.use middle ware sets /auth as auth route (everything goes through /api/auth)
  apiRoutes.use('/auth', authRoutes);
  apiRoutes.get('/dashboard', requireAuth, function(req, res) {  
    res.send('It worked! User id is: ' + req.user._id + '.');
  });


  // Set user routes as a subgroup/middleware to apiRoutes
  apiRoutes.use('/user', userRoutes);

  // View user profile route
  userRoutes.get('/:userId', requireAuth, UserController.viewProfile);

  // Test protected route
  apiRoutes.get('/protected', requireAuth, (req, res) => {
    res.send({ content: 'The protected test route is functional!' });
  });
  // Registration route
  authRoutes.post('/register', AuthenticationController.register);
  // Login route
  authRoutes.post('/login', requireLogin, AuthenticationController.login);
  */

  // Problem Area --> Making POST req to /questions
  apiRoutes.post('/questions', requireAuth, QuestionController.addQuestion);

  // Set url for API group routes
  app.use('/api', apiRoutes);
};

您已将模式定义为接受用户的问题ID

questions: [
  {
      type: Schema.Types.ObjectId,
      ref: 'Question'
  }
使用
Question.create(newQuestion,(err,Question)…保存后,
回调属性
Question
具有更新的数据,其中一个具有
ObjectId

现在,将此
ObjectId
值添加到从
User
model上的
findById
获取的现有
questions
数组中

user.questions.push(question._id);

当你在问题数组中使用
填充
时,Mongoose将使用
问题ID
来填充你的问题对象,但这是检索信息的一部分。

嗨,托马斯·格雷科;你粘贴在那里的代码太多了。你能试着把它修改成一个吗?我很抱歉,我没有意识到我必须在模型中添加用于每个集合两次,但我仔细检查并删除了一段与我的问题无关的代码。我只包含了AuthController和其他与auth相关的东西,以表明API工作正常(除了这个例子:P)您可以尝试
user.questions.push(question.u id);
而不是
user.questions.push(newQuestion)
?很有效!!!@Veeram非常感谢。你知道这个问题的原因吗?我想我需要将新问题对象封装在
newQuestion
中,然后将该对象推到我的数据库中。再次感谢:)太棒了。非常感谢你!