TypeError: невозможно прочитать свойство «применить» неопределенного в EventEmitter

Я создаю приложение node js с планировщиком DHTMLX в качестве одной из страниц. Однако всякий раз, когда страница загружается, приложение вылетает, и я получаю следующую ошибку:

TypeError: невозможно прочитать свойство «применить» для undefined в EventEmitter.(/node_modules/mongoskin/lib/collection.js:52:21))

Вот модуль, на который ссылается ошибка:

  SkinCollection.prototype._open = function(callback) {
    var collection_args = this._collection_args.concat([callback]);
    this._skin_db.open(function(err, db) {
        if(err) return callback(err);
        db.collection.apply(db, collection_args);
    });
  }

И вот часть моего app.js, которая вызывает ошибку, когда я не включаю этот код, календарь не приводит к сбою приложения, но у меня нет возможности отправить данные в мой кластер атласа MongoDB.

app.js

    app.use(express.static(path.join(__dirname, 'public')));
    app.use(bodyParser.json());
    app.use(bodyParser.urlencoded({ extended: true }));

    app.get('/init', function(req, res){
        db.event.insert({ 
            text:"My test event A", 
            start_date: new Date(2018,8,1),
            end_date:   new Date(2018,8,5)
        });
        db.event.insert({ 
            text:"My test event B", 
            start_date: new Date(2018,8,19),
            end_date:   new Date(2018,8,24)
        });
        db.event.insert({ 
            text:"Morning event", 
            start_date: new Date(2018,8,4,4,0),
            end_date:   new Date(2018,8,4,14,0)
        });
        db.event.insert({ 
            text:"One more test event", 
            start_date: new Date(2018,8,3),
            end_date:   new Date(2018,8,8),
            color: "#DD8616"
        });

        res.send("Test events were added to the database")
    });


    app.get('/data', function(req, res){
        db.event.find().toArray(function(err, data){
            //set id property for all records
            console.log(err);
            for (var i = 0; i < data.length; i++)
                data[i].id = data[i]._id;

            //output response
            res.send(data);
        });
    });


    app.post('/data', function(req, res){
        var data = req.body;
        var mode = data["!nativeeditor_status"];
        var sid = data.id;
        var tid = sid;

        delete data.id;
        delete data.gr_id;
        delete data["!nativeeditor_status"];


        function update_response(err, result){
            if (err)
                mode = "error";
            else if (mode == "inserted")
                tid = data._id;

            res.setHeader("Content-Type","application/json");
            res.send({action: mode, sid: sid, tid: tid});
        }

        if (mode == "updated")
            db.event.updateById( sid, data, update_response);
        else if (mode == "inserted")
            db.event.insert(data, update_response);
        else if (mode == "deleted")
            db.event.removeById( sid, update_response);
        else
            res.send("Not supported operation");
    });

Я изучаю javascript только на прошлой неделе и очень новичок в кодировании. Я не понимаю, почему эта ошибка возникает. Когда я запускаю приложение Scheduler как отдельную функцию, оно работает безупречно. Только когда я пытаюсь реализовать его на своем веб-сайте, он выдает эту ошибку.


person tyler    schedule 03.02.2019    source источник
comment
мне кажется, что ваш возвращаемый объект БД не имеет свойства collection.   -  person Johannes Merz    schedule 03.02.2019
comment
Как я могу это исправить. Вот моя декларация БД: var db = require('mongoskin').db("linkToMyCluster", { w: 0}); db.bind('event');   -  person tyler    schedule 03.02.2019


Ответы (1)


Обновление: правильный ответ

Этот вопрос является дубликатом: MongoSkin не может прочитать свойство "применить" неопределенного

Mongoskin поддерживает только MongoDB 2.x, эта ошибка возникает при использовании MondoDB 3.x.

Исходный (неправильный) ответ

Я сам довольно новичок в MongoDB, но я уверен, что проблема в том, что вам нужно заменить collection на фактическое имя таблицы в этой строке:

db.collection.apply(db, collection_args);

Так, например, если имя таблицы/коллекции было skin, строка стала бы такой:

db.skin.apply(db, collection_args);

(Обратите внимание, когда app.j выполняет операцию базы данных в таблице событий, она вызывает db.event.insert() и т. д.)

person JoshuaCWebDeveloper    schedule 03.02.2019
comment
Я уже пытался изменить файл collection.js на db.event.apply (поскольку моя коллекция называется event), но он все равно выдает ту же ошибку. - person tyler; 03.02.2019
comment
Плохо, я не видел, чтобы ошибка исходила от стороннего модуля, а не от вашего кода. Похоже, что этот вопрос может дублироваться: stackoverflow.com/questions/53900890/, попробуйте проверить и посмотреть, есть ли у вас тот же конфликт версий, что и у этого пользователя. - person JoshuaCWebDeveloper; 03.02.2019
comment
Спасибо. Это была проблема с версией. Я не знаю, как этот вопрос не возник в моих поисках, я, должно быть, недостаточно внимательно искал: P - person tyler; 03.02.2019