如何解决无法在nodejs应用程序中读取未定义的属性“推送”?

时间:2017-03-13 05:48:19

标签: node.js mongodb mongoose-schema

当我向子文档添加值时,在命令提示符中显示错误
 像无法读取属性push。我怎么解决这个问题?

在这些my schema code的帮助下,我给父模式提供了值  但是我无法给这个子文档赋值:

var venueSchema = new Schema({
    name:  {
        type: String,
        required: true,
        unique:true
    },
    address:  {
        type: String,
        required: true
    }
}, {
    timestamps: true
});

// create a schema
var batchSchema = new Schema({
   batchname: {
        type: String,
        required: true,
        unique: true
    },
    activityname: {
        type: String,
        required: true
    },
    time: {
    type:String,
    required:true
    },
    duration: {
    type:String,
    required:true
    },
    classtype: {
    type:String,
    required:true
    },
    trainer: {
    type:String,
    required:true
    },
    price:{
    type:Currency,
    required:true,
    unique:true
    },

    venue:[venueSchema]
}, {
    timestamps: true
});  

我的Routing code

batchRouter.route('/:batchId/venue')
.post(function (req, res, next) {
    Batches.findById(req.params.batchId, function (err, batch) {
        if (err) throw err;
      batch.venue.push(req.body);
        batch.save(function (err, batch) {
            if (err) throw err;
            console.log('Updated venue!');
            res.json(batch);
        });
    });
})

此处,父文档为batchSchema,子文档为venueSchema
后  创建批处理我将获得id。在id的帮助下,我试图在当时向场地添加值,它向我显示了错误  batch.venue.push(req.body);

4 个答案:

答案 0 :(得分:3)

您获得的错误意味着:

  1. 您没有收到数据库中的错误,因为if (err) throw err;没有触发
  2. 您的batch.venue未定义,因为您获得Cannot read property 'push' of undefined
  3. 您的batch已定义,因为您没有Cannot read property 'venue' of undefined
  4. 这意味着您与数据库建立了连接,您将获得一个包含所需ID的文档,但它没有您期望存在的属性venue并且是一个阵列。

    而不是:

    batch.venue.push(req.body);
    

    你可以使用:

    if (!Array.isArray(batch.venue)) {
        batch.venue = [];
    }
    batch.venue.push(req.body);
    

    或:

    if (Array.isArray(batch.venue)) {
        batch.venue.push(req.body);
    } else {
        batch.venue = [req.body];
    }
    

    或类似的东西,即在尝试将元素推送到它之前需要检查是否有数组。如果你没有阵列,那么你将不得不创建一个新阵列。

答案 1 :(得分:1)

这也可以解决:

Batches.findById(req.params.batchId, function (err, batch) {
    if (err) throw err;
  const a = req.body.venue;
  for(i=0;i<a.length;i++ )
  {
   batch.venue.push(req.body.venue[i]);
  }

    batch.save(function (err, batch) {
        if (err) throw err;
        console.log('Updated venue!');
        res.json(batch);
    });
});

答案 2 :(得分:0)

Router();

在此方法中,如果我们不提及(),也会显示推送错误...

const express = require('express');
const routerd = express.Router();
const Ninja = require('./models/ninja');

routerd.delete('/ninja:/id', function(req, res, next){
    console.log(req.params.id);
    res.send({type : 'DELETE'});
}).catch(next);

module.exports = routerd;

答案 3 :(得分:0)

如果我们未正确导入路由器,则会收到此错误。

示例代码段

const express = require('express')
const router = express.Router();

router.get("/signout", (req, res) =>{
  res.send("user sign out")
 })


module.exports = router;