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

avatar
feishuoren
8 апреля 2018 в 09:35
576
1
2

Я хочу вставить данные в коллекцию, перед вставкой мне нужно проверить, существуют ли они

  collection.find({sno: req.body.sno}).toArray((err, result)=> {

    if (result.length > 0) {
      flag = false;
      callback(flag);
    }
    else {
      console.log(result.length);
      collection.insertOne({sno: req.body.sno, password: req.body.password}, (err, insertResult)=> {
        if (insertResult.result.ok === 1) {  
          flag = true;
        }
        callback(flag);
      });
    }
  });

если sno не существует, я получил

0
/node_modules/mongodb/lib/utils.js:123
process.nextTick(function() { throw err; });
                              ^

TypeError: Cannot read property 'result' of undefined

Но, если snoсуществует или только collection.insertOne(удалить collection.find), это сработало.

Как решить эту проблему? Пожалуйста, помогите мне.

кажется, проблема с аргументами функции обратного вызова??

collection.find({xx:xx}).toArray((err, result)=> {
    collection.insertOne({...}),(err)=>{}  //can't use res??
&&
collection.inserOne({...}),(err,res)=>{
  console.log(res.result); // {ok:1,n:1}
}
Источник
kgangadhar
8 апреля 2018 в 09:37
0

правильно проверить? insertResult похоже не содержит result в insertResult.result.ok

feishuoren
8 апреля 2018 в 09:46
0

Я пытаюсь выполнить console.loginsertResult (только insertOne), он содержит `result: {ok: 1, n: 1}`

feishuoren
8 апреля 2018 в 10:00
0

я получил undefined?

kgangadhar
8 апреля 2018 в 10:03
0

Попробуйте добавить отказоустойчивый код: if (insertResult && insertResult.result && insertResult.result.ok === 1) {

Ответы (1)

avatar
abdhalees
8 апреля 2018 в 11:02
1

попробуйте зарегистрировать ошибку и посмотрите, что получится. в любом случае, если вы хотите узнать длину курсора, вам не нужно преобразовывать его в массив, используйте cursor.count(). в вашем случае:

 collection.find({sno: req.body.sno}).count()

также, если вы согласны с использованием промисов, я бы предложил этот подход.

 collection.find({sno: req.body.sno})
.then(result => {
  if (result.count() < 1) throw new Error() 
   })
 .then(() =>{
 // insert
 flag = true;
 })
 .catch(err => {
 flag = false; 
})