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

Sye*_*ebe 6 mongodb node.js mongoose-schema

当我向子文档添加值时,在命令提示符中它显示了
诸如 cannot read property 之类的错误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
});  
Run Code Online (Sandbox Code Playgroud)

而我的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);
        });
    });
})
Run Code Online (Sandbox Code Playgroud)

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

小智 7

路由器();

在这个方法中如果我们没有提到 () 这也会显示推送错误......

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;
Run Code Online (Sandbox Code Playgroud)


rsp*_*rsp 3

您收到的错误意味着:

  1. 您不会从数据库收到错误,因为if (err) throw err;不会触发
  2. batch.venue的未定义,因为你得到Cannot read property 'push' of undefined
  3. 你的batch定义是因为你没有得到Cannot read property 'venue' of undefined

这意味着您与数据库建立了连接,您获得了一个具有所需 ID 的文档,但它不具有venue您期望存在且为数组的属性。

代替:

batch.venue.push(req.body);
Run Code Online (Sandbox Code Playgroud)

您可以使用:

if (!Array.isArray(batch.venue)) {
    batch.venue = [];
}
batch.venue.push(req.body);
Run Code Online (Sandbox Code Playgroud)

或者:

if (Array.isArray(batch.venue)) {
    batch.venue.push(req.body);
} else {
    batch.venue = [req.body];
}
Run Code Online (Sandbox Code Playgroud)

或类似的东西,即在尝试将元素推送到数组之前,您需要检查是否有数组。如果您没有数组,则必须创建一个新数组。