简体   繁体   中英

nodejs mongodb cant connect in docker.\

image build and dockerizing working fine but mongodb connect not woring. without docker localhost working fine. this my code: schema: clientSchema.js

const mongoose = require('mongoose');


const ClientData = mongoose.Schema({
    clientName: {
        type: String
    },
    companyName: {
        type: String
    },
    clientStatus: {
        type: String
    },
    project:[{
        clientName:{type:String},
        projectName: {type: String},
        proStatus:{type: String}
        }]   
})

module.exports = mongoose.model("ClientData",ClientData);

index.js

const express = require('express');
const app = express();
const mongoose = require('mongoose');
const userRouter = require('./router');
// const morgan = require('morgan');
const cors = require('cors');

app.use(cors());
app.use(express.json());
// app.use(morgan('development'));

app.listen(8000, () => {
    console.log("Server started at 8000");
})

app.use('/api', userRouter);

mongoose.connect("mongodb://localhost:27017/proj1",{useCreateIndex: true, 
                                                    useUnifiedTopology: true, 
                                                    useNewUrlParser: true },  () => {
    console.log("DB connected Sucessfully");
})

router.js

const router = require('express').Router();
const User = require('./userSchema');
const bcrypt = require('bcryptjs');
const jwt = require("jsonwebtoken");
const ClientData = require('./clientSchema');
router.post("/clientpostdata", async(req, res) => {
    try{
        var clientExist = await ClientData.findOne({clientName:req.body.clientName});
        if (clientExist){
            return res.status(400).json("Client already exists");

        }
        var clientdata = new ClientData({
            clientName: req.body.clientName,
            companyName: req.body.companyName,
            clientStatus: req.body.clientStatus,
    
    });
    var data = await clientdata.save();
    res.json(data);
}   catch(e){
    res.status(400).json(e)
}
});


router.get('/clientgetdata', async(req, res) => {
    var findData = await ClientData.find().select(['-__v']);
    res.json(findData)
    console.log(findData)

});

router.get('/clientgetdata/:id', async(req, res) => {
    var findData = await ClientData.find({_id:req.params.id}).select(['-__v']);
    res.json(findData)

});

router.delete("/clientdeldata/:id", async(req, res) => {
    var getData = await ClientData.deleteOne({ _id: req.params.id }).then(e => {
        res.json(e)
    })

})

router.put("/clientupddata/:id", async(req, res) => {

    var updData = await ClientData.update({ _id: req.params.id }, {
        $set: {
            clientName: req.body.clientName,
            companyName: req.body.companyName,
            clientStatus: req.body.clientStatus,
        }
    }).then(e => {
        var delData = ClientData.findOne({ _id: req.params.id }).then(e => {
            res.json(e)
        })
    }).catch(err => {
        console.log(err);
    })
})
module.exports = router;

Dockerfile:

FROM node:latest
# Create app directory
WORKDIR /usr/src/app
# Install app dependencies
COPY package*.json ./
COPY yarn.lock ./

RUN yarn install
# Copy app source code
COPY . .

#Expose port and start application
EXPOSE 8000
CMD [ "yarn", "start" ]

docker-compose.yml

version: '3' services: app: container_name: docker-node-mongo restart: always build: . ports: - '8000:8000' links: - mongo mongo: container_name: mongo image: mongo ports: - '27017:27017'

For docker your link should be

mongoose.connect("mongodb://mongo:27017/proj1...

localhost -> mongo

You used the links attribute to mongo in your docker-compose.yml. That would result in a hostname of mongo in your /etc/hosts of the web docker container.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM