Προς το περιεχόμενο

Χρήση της MongoDB τοπικά σε NextJS project


johnykim

Προτεινόμενες αναρτήσεις

Δημοσ. (επεξεργασμένο)

Καλησπέρα.

Σε ένα NextJS project χρησιμοποιώ MongoDB Atlas, ένα cloud database service. Θα ήθελα να χρησιμοποιώ τη βάση τοπικά, και έτσι κατέβασα την MongoDB και το Compass UI.

Το DATABASE_URL από το .env file με το Atlas, είναι αυτό: DATABASE_URL="mongodb+srv://username:[email protected]/test" , με test το όνομα της βάσης.

Η λύση φαίνεται να είναι συγκεκριμένη, εδώ: https://stackoverflow.com/questions/73570090/prisma-mongodb-replica-set

Λέει δηλαδή να κάνω:

1) pull ένα docker image (https://hub.docker.com/r/prismagraphql/mongo-single-replica/tags), και να τρέξω ένα container.
2) Να τρέξω το image έτσι: docker run --name mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME="john" -e MONGO_INITDB_ROOT_PASSWORD="pass" -d prismagraphql/mongo-single-replica:5.0.3
3) Να χρησιμοποιήσω το DATABASE_URL="mongodb://john:pass@localhost:27017/db_name?authSource=admin&directConnection=true"

Το σχήμα το ανεβάζω επιτυχώς: npx prisma db push . Η εφαρμογή ξεκινά, αλλά όταν πάω να κάνω κάποια ενέργεια, πχ να κάνω register έναν χρήστη, παίρνω το παρακάτω log:

Prisma needs to perform transactions, which requires your MongoDB server to be run as a replica set. https://pris.ly/d/mongodb-replica-set
    at Hr.handleRequestError (C:\Repos\booking-system\node_modules\@prisma\client\runtime\library.js:122:6999)
    at Hr.handleAndLogRequestError (C:\Repos\booking-system\node_modules\@prisma\client\runtime\library.js:122:6388)
    at Hr.request (C:\Reposs\booking-system\node_modules\@prisma\client\runtime\library.js:122:6108)
    at async l (C:\Repos\booking-system\node_modules\@prisma\client\runtime\library.js:126:10298)
    at async POST (webpack-internal:///(rsc)/./app/api/register/route.ts:16:18)
    at async eval (webpack-internal:///(rsc)/./node_modules/next/dist/server/future/route-modules/app-route/module.js:254:37) {
  code: 'P2031',
  clientVersion: '5.1.1',
  meta: {}
}

Άλλη λύση που βρήκα, είναι να τρέξω το image έτσι: docker run --name mongo -p 27017:27017 -e MONGO_INITDB_ROOT_USERNAME="john" -e MONGO_INITDB_ROOT_PASSWORD="pass" -d prismagraphql/mongo-single-replica:5.0.3 --replSet rs0

Και από το project, να ανεβάσω το σχήμα, έτσι: DATABASE_URL="mongodb://john:pass@localhost:27017/?authSource=admin&replicaSet=rs0"

Σε αυτή τη περίπτωση Α) Το container μετά από λίγο σταματάει, και Β) το σχήμα δεν γίνεται push:

The provided database string is invalid. An invalid argument was provided: Database must be defined in the connection string in database URL. Please refer to the documentation in https://www.prisma.io/docs/reference/database-reference/connection-urls for constructing a correct connection string. In some cases, certain characters must be escaped. Please check the string for any illegal characters.


Γνωρίζει κάποιος πως να φτιάξω σωστά το container; Δεν έχω ασχοληθεί ξανά με docker. Αν φυσικά ξέρει κάποιος άλλον τρόπο για να χρησιμοποιεί τοπικά την MongoDB, ακόμα καλύτερα!

Επεξ/σία από johnykim
Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δεν είμαι στο pc τώρα αλλά νομίζω πιο γρήγορο θα είναι να κάνεις μια dev βάση στο atlas που δίνει αν θυμάμαι καλά 500mb free και να παίξεις έτσι.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

5 ώρες πριν, johnykim είπε

Δεν έχω ασχοληθεί ξανά με docker

Δεν είναι απαραίτητο να χρησιμοποιήσεις docker. Όταν δοκίμασα μια φορά την mongo το είχα κάνει χωρίς docker. Έτσι κι αλλιώς αν δεν χρησιμοποιείς docker και στα υπόλοιπα αμφιβάλλω αν θα σε βοηθήσει κάπου στο πρότζεκτ σου.

5 ώρες πριν, johnykim είπε

Αν φυσικά ξέρει κάποιος άλλον τρόπο για να χρησιμοποιεί τοπικά την MongoDB, ακόμα καλύτερα!

Εγώ θα πήγαινα σε αυτό τον οδηγό. Θα σε συμβούλευα να αποφύγεις επιλογές τρίτων για UI για αρχή. Εγκατέστησε την mongo και τρέξε την από το terminal/cmd. Είναι πιο εύκολο και δεν υπάρχουν πολλά περιθώρια λάθους.

5 ώρες πριν, johnykim είπε

Και από το project, να ανεβάσω το σχήμα, έτσι: DATABASE_URL="mongodb://john:pass@localhost:27017/?authSource=admin&replicaSet=rs0"

5 ώρες πριν, johnykim είπε

Β) το σχήμα δεν γίνεται push

Τι εννοείς στο σχήμα; Εννοείς το .env αρχείο; Το .env δεν πρέπει να το κάνεις push! Μόνο στο .env.example ή .env.development πρέπει να προσθέσεις την αλλαγή σου. Δεν σε αφήνει να το κάνεις push (και καλά κάνει) διότι είναι στο .gitignore αρχείο. Ό,τι έχεις εκεί μέσα δεν γίνεται push.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αν δεν κάνω λάθος, από την mongo 5 και πάνω, το setup πρέπει να περιλαμβάνει replicas ακόμα κι αν είναι μόνο ένα. Ξεκίνα τον server μέσα στο container με την παράμετρο  --replSet "rs0", συνδέσου μέσω ssh στο container και μετά στη mongo σαν admin και εκτέλεσε rs.initiate().ok και rs.status().ok. Λογικά θα κάνει αρχικοποίηση στο replication και θα σου λύσει το πρόβλημα.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστώ για τις απαντήσεις. Λόγω χρόνου, δεν έχω επιχειρήσει να δοκιμάσω τίποτα. Δουλεύω απλά το cluster του Ατλα μέσα από το compass για μεγαλύτερη ευκολία.

Θα ενημερώσω αν δοκιμάσω κάτι άλλο.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...