无法读取未定义的猫鼬Node.js的属性'id'

时间:2018-09-16 19:24:53

标签: javascript node.js mongoose

我正在尝试从mongodb中获取删除对象。但是我得到以下错误。

  

无法读取未定义的属性“ id”

我想通过Schema中的Id和Id获取对象只是因为我正在尝试使用nodejs和mongoDB进行gRPC,没有数据库时gRPC代码工作正常,但是在连接到数据库后,当我尝试跟踪错误时,它的抛出错误仅在nodejs中出现了上述错误,最后附加了测试代码。

注意:“插入和列出”工作正常。

这是我的猫鼬图式

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const todoSchema = new Schema({
    id: {
        type: Number,
        required: true,
        unique: true,
    },
    title: {
        type: String,
        required: "Enter title"
    },
    description: {
        type: String,
        required: "Enter Description"
    },
    done: {
        type: Boolean,
        default: false
    },
    createdate: {
        type: Date,
        default: new Date()
    }
})

module.exports = mongoose.model('todo', todoSchema);

这是我的tododb代码

var todoModel = require('./models/todo')

var Todo = class {

    constructor(payload) {
        this.payload = payload;
    }

    static list(callback) {
        todoModel.find({}, callback);
    }

    insert(callback) {
        new todoModel(this.payload).save(callback);
    }

    get(callback) {
        const condition = this.payload.condition;
        todoModel.find(condition). exec(callback)
    }

    delete(callback) {
        const condition = this.payload;
        todoModel.remove(condition, callback);
    }
};
module.exports = Todo;

测试代码在这里

var assert = {
    get: function (call,callback) {
        var payload = {
            condition: {
                id: call
            }
        };
        var t = new TodoDb(payload);


   t.get(callback);
    },
};


try {
    assert.get(40, callback);
    console.log('Passed.');
} catch (error) {
    console.log(error.message);
}

注2:我也是JS及其技术的初学者

2 个答案:

答案 0 :(得分:1)

您正在执行的测试代码中:

assert.get(40);

assert.get使用参数调用= 40执行以下功能

function (call) {
    var payload = {
        condition: {
            id: call.request.id
        }
    };
    var t = new TodoDb(payload);


    t.get(callback);
}

因此,如果call = 40,那么

的值是多少?
  

call.request.id

通话= 40

call.request = 40.request =未定义

call.request.id = 40.request.id = undefined.id

给出错误:

  

无法读取未定义的属性“ id”


这意味着您正在尝试访问undefinednull对象上的属性ID

答案 1 :(得分:0)

这部分代码:

cy.Wait()

您打电话给var assert = { get: function (call) { var payload = { condition: { id: call.request.id } }; var t = new TodoDb(payload); t.get(callback); }, }; ,而assert.get(40);中的call不是数字对象。

所以assert.getcall=40call.request