Переход с firestore на mongodb, подключение к mongodb

#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. Что вы имеете в виду под исключением? Извиняюсь за глупые вопросы :/