Соединение MongoDB с nodejs возвращает обещание

#javascript #node.js #mongodb

#javascript #node.js #mongodb

Вопрос:

Всем доброго утра! Несколько недель назад я начал изучать javascript, node.js и монго, так что я довольно новичок. Сегодня я хочу выполнить простую задачу. Я хочу добавить простой документ в MongoDB и проверить условие. Поэтому я хочу сделать это:

  1. подключитесь к MongoDB
  2. прежде чем вставить документ, я хочу проверить, существует ли уже существующее имя. Если имя уже занято, верните сообщение об ошибке
  3. вставьте документ.

Я сделал это:

     function addDocument(req, res){
       //did some statements to check valid document fields and values

       MongoClient.connect(uri, {
           useUnifiedTopology: true
           }, (err, client) => {
           if (err) return console.error(err)
           console.log('Connected to Database')
           let db = client.db('data');
           let serviceCollection = db.collection('services');
           let checkName = serviceCollection.find({
               'name': name //this variable is declared as req.body.name and it prints the name from the request
           }).count().then(result => {
               return resu<
           })

           console.log(checkName);//this doesn't print anything and returns the pending promise
           //here I want to put a conditional statement like: if(checkName>0) return res.send("name already exists")
           serviceCollection.insertOne(service)
           })

        return res.send("Done!")
    }
 

Если я удалю консоль оператора.войти или «если» Это сработает. Он добавляет документ в базу данных, но с дублированными «именами».
Если я изменю консоль.журнал с:

 checkName.then(r=>{console.log(r)})
 

затем он печатает количество документов с заданным именем. Что я должен сделать, чтобы справиться с этим с помощью оператора «if» и вернуть ошибку, если она равна> 0?

Документ JSON выглядит следующим образом:

 {
    "name": "marco",
    "field2": "example"
    //etc
}
 

Эта функция экспортируется в app.js и используется в методе post в качестве обратного вызова.
Большое вам спасибо!

Ответ №1:

Проблема, с которой вы сталкиваетесь, заключается в том, что вы не ждете выполнения обещания.Вы можете либо переместить код, как только обещание будет выполнено, либо дождаться его. Взгляните на https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise . Измените код с

 let checkName = serviceCollection.find({
    'name': name //this variable is declared as req.body.name and it prints the name from the request
}).count().then(result => {
    return resu<
})
 

Для

 let checkName = await serviceCollection.find({
    'name': name //this variable is declared as req.body.name and it prints the name from the request
}).count();
 

Или дождитесь выполнения обещания, прежде чем использовать его возвращаемое значение. т.е.

 serviceCollection.find({
    'name': name //this variable is declared as req.body.name and it prints the name from the request
}).count().then(result => {
    console.log(result);//this doesn't print anything and returns the pending promise
//here I want to put a conditional statement like: if(checkName>0) return res.send("name already exists")
serviceCollection.insertOne(service)
})
})
 

Комментарии:

1. Спасибо, но если я помещаю await, он выдает ошибку с надписью «await может использоваться только в асинхронной функции». Я ввел это ключевое слово раньше function addDocument(res req) , но оно по-прежнему выдает мне ту же ошибку.