#javascript #node.js #mongodb
#javascript #node.js #mongodb
Вопрос:
Всем доброго утра! Несколько недель назад я начал изучать javascript, node.js и монго, так что я довольно новичок. Сегодня я хочу выполнить простую задачу. Я хочу добавить простой документ в MongoDB и проверить условие. Поэтому я хочу сделать это:
- подключитесь к MongoDB
- прежде чем вставить документ, я хочу проверить, существует ли уже существующее имя. Если имя уже занято, верните сообщение об ошибке
- вставьте документ.
Я сделал это:
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)
, но оно по-прежнему выдает мне ту же ошибку.