Home > OS >  When I click the client site then show this error
When I click the client site then show this error

Time:10-26

This is my Code

const express = require('express');
const { MongoClient } = require('mongodb');
const cors = require('cors');
require('dotenv').config()


const app = express();

const port = 5000;

// middle ware
app.use(cors());
app.use(express.json());



const uri = `mongodb srv://${process.env.DB_USER}:${process.env.DB_PASS}@cluster0.84pml.mongodb.net/myFirstDatabase?retryWrites=true&w=majority`;
const client = new MongoClient(uri, { useNewUrlParser: true, useUnifiedTopology: true });
client.connect(err => {
    const collection = client.db("carMechanic").collection("services");
    // perform actions on the collection object
    client.close();
});

async function run() {
    try {
        await client.connect();
        const database = client.db("carMechanic");
        const servicesCollection = database.collection("services");

        // post API
        app.post('/services', async (req, res) => {
            const service = req.body;
            // console.log('hit the post is', service);
            const result = await servicesCollection.insertOne(service);
            console.log(result);
            res.send('post hitted')
        });

    }

    finally {
        // await client.close();
    }
}

run().catch(console.dir);


app.get('/', (req, res) => {
    res.send('Running Genius Server');
});

app.listen(port, () => {

});

And This is the error message

G:\web_projects\practice\node\module-65-Genius-car\backend\node_modules\mongodb\lib\utils.js:690
            throw new error_1.MongoRuntimeError(`illegal state transition from [${target.s.state}] => [${newState}], allowed: [${legalStates}]`);
            ^

MongoRuntimeError: illegal state transition from [closed] => [connected], allowed: [closed,connecting]
    at stateTransition (G:\web_projects\practice\node\module-65-Genius-car\backend\node_modules\mongodb\lib\utils.js:690:19)
    at G:\web_projects\practice\node\module-65-Genius-car\backend\node_modules\mongodb\lib\sdam\topology.js:226:21
    at G:\web_projects\practice\node\module-65-Genius-car\backend\node_modules\mongodb\lib\cmap\connection_pool.js:272:25
    at handleOperationResult (G:\web_projects\practice\node\module-65-Genius-car\backend\node_modules\mongodb\lib\sdam\server.js:363:9)
    at MessageStream.messageHandler (G:\web_projects\practice\node\module-65-Genius-car\backend\node_modules\mongodb\lib\cmap\connection.js:479:9)
    at MessageStream.emit (events.js:375:28)
    at processIncomingData (G:\web_projects\practice\node\module-65-Genius-car\backend\node_modules\mongodb\lib\cmap\message_stream.js:108:16)
    at MessageStream._write (G:\web_projects\practice\node\module-65-Genius-car\backend\node_modules\mongodb\lib\cmap\message_stream.js:28:9)
    at writeOrBuffer (internal/streams/writable.js:358:12)
    at MessageStream.Writable.write (internal/streams/writable.js:303:10)

CodePudding user response:

I answered myself.

I had made a mistake, that was I wrote the extra code given below.

client.connect(err => {
    const collection = client.db("carMechanic").collection("services");
    // perform actions on the collection object
    client.close();
});

Because this has already been declared inside of my function.

await client.connect();
        const database = client.db("carMechanic");
        const servicesCollection = database.collection("services");

When I remove this--

client.connect(err => {
    const collection = client.db("carMechanic").collection("services");
    // perform actions on the collection object
    client.close();
});

the code is working well.

CodePudding user response:

The problem is this line:

client.connect(err => {
    const collection = client.db("carMechanic").collection("services");
    // perform actions on the collection object
    client.close();
});

you don't need this because you made connection to the database later

CodePudding user response:

I have my code below and works as is. A few things:

  1. Install dependencies again if needed
  2. I am using the sample airbnb db they provide in Atlas service on cloud.mongodb.com
  3. Change username:0987654321 to your own username and password where 'username' is the username and 0987654321 is the password.
  4. Run() works fine locally but it's not straight forward to have a local method start a server endpoint and keep track of it or vice versa. For that you need good chaining

So only USE the run method to test locally and it works fine or use the express endpoints to test via your app client side or curl or postman and that works too independently.

Heres my whole server file:

const express = require('express');
const { MongoClient } = require('mongodb');
const cors = require('cors');

// middle ware
const app = express();
const port = 5000;

// middle ware
app.use(cors());
app.use(express.json());

const uri = "mongodb://username:[email protected]:27017,cluster0-shard-00-01.czraf.mongodb.net:27017,cluster0-shard-00-02.czraf.mongodb.net:27017/sample_airbnb?ssl=true&replicaSet=atlas-wmfxrm-shard-0&authSource=admin&retryWrites=true&w=majority";

async function run(){

    //1 connect
    const client = await MongoClient.connect(uri, { 
        useNewUrlParser: true, 
        useUnifiedTopology: true,
    });

   //2 set db and collection
   const collection = client.db("sample_airbnb").collection("listingsAndReviews");
   // perform actions on the collection object
   
   //3 CREATE
   let doc = {
        "_id":"100009090",
        "listing_url":"https://www.airbnb.com/rooms/100009190",
        "name":"Ribeira Charming Duplex",
        "summary":"Fantastic duplex apartment with three bedrooms, located in the historic area of Porto, Ribeira (Cube)",
        "neighborhood_overview":"In the neighborhood of the river, you can",
        "price":"250gbp"
    }


    //4.0 POST INDEPENDENTLY
    //collection.insertOne(doc).then(doc => { console.log('inserted id is: ', doc.insertedId)});

    //FIND ONE
    //const result = await collection.find( {_id: {$eq: "10006546"} }).toArray();
    //FIND MANY
    //const many = await collection.find( {_id: { $in: ["10006546", "100009090"] } } ).toArray();
    //LOGGER
    //console.log(many)

    client.close();
};


//server methods
//get route
app.get('/', (req, res) => {
    res.send('Running Genius Server');
});

//get docs
app.get('/docs',  async (req, res) => {
    //FIND MANY
    const many = await collection.find( {_id: { $in: ["10006546", "100009090"] } } ).toArray();
    //LOGGER
    console.log(many)
    res.send('docs returned', JSON.stringify(many));
});

//add docs
app.post('/test', async (req, res)  => {
    //get data through body
    const service = req.body.name;
    //get data through query params in url
    const qparam = req.query.name;
    const _id = req.query.id;
    //build your doc
    let doc = {service:qparam, _id: _id};
    //connect to db and collection
     //2 set db and collection
     //1 connect
    const client = await MongoClient.connect(uri, { 
        useNewUrlParser: true, 
        useUnifiedTopology: true,
    });
    const collection = client.db("sample_airbnb").collection("listingsAndReviews");
    collection.insertOne(doc).then(doc => { console.log('inserted id is: ', doc.insertedId)});
    // /res.status(status).send(body)
    res.send(JSON.stringify(service   ' '   qparam));
});

app.listen(port, () => {

});

run();
  • Related