#javascript #node.js #mongodb
#javascript #node.js #mongodb
Вопрос:
Я переношу свою базу данных из firestore в mongodb. Раньше я вызывал базу данных с помощью const.
const db = firebase.firestore();
firebase.firestore().settings({
cacheSizeBytes: firebase.firestore.CACHE_SIZE_UNLIMITED
});
db.collection("users").doc(user.uid)
.get().then(function(doc) {
if (doc.exists) {
//do something
} else {
console.log("No such document!")
}}).catch(function(error) {
console.log("Error getting document:", error)
});
Теперь в mongodb я создаю, если нужны данные, MongoClient.connect().
Есть ли способ вызвать функцию или const и сделать то же самое, что и в firestore, или более чистый способ?
const mongo = require('mongodb');
const MongoClient = mongo.MongoClient;
const url = 'mongodb://localhost:27017';
const dbname = "dbname";
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) throw err;
const db = client.db(dbname);
let collection = db.collection('users');
collection.findOne({ _id: user.uid }).then(user => {
//do something
}).catch((err) => { console.log(err);
}).finally(() => { client.close(); });
});
Ответ №1:
Вы можете сделать что-то вроде этого. Создайте функцию-оболочку для вызовов базы данных
function findOne(query,collectionName,callback){
MongoClient.connect(url, { useNewUrlParser: true, useUnifiedTopology: true }, (err, client) => {
if (err) throw err;
const db = client.db(dbname);
let collection = db.collection(collectionName);
collection.findOne(query).then(user => {
callback(null,user);
}).catch((err) => { callback(err,null);
}).finally(() => { client.close(); });
});
}
Аналогичным образом вы можете создать несколько функций для других операций или вы можете создать только одну функцию, а затем использовать ее в качестве оболочки. Основная идея здесь заключается в том, что мы можем использовать механизм обратного вызова
Для использования его
route.get('/',(req,res,next)=>{
findOne({ _id: user.uid },'users',(err,user)=>{res.send(user)})
})
Комментарии:
1. Спасибо! Это способ сделать его чище 🙂
2. Если я использую функцию, я не получаю обратно информацию о пользователе.
3. Когда я использую «user.username», я получаю сообщение об ошибке
ReferenceError: user is not defined
.4. Возможно, вы получаете какое-либо исключение перед вызовом обратного вызова.
5. Что вы имеете в виду под исключением? Извиняюсь за глупые вопросы :/