Соединение с базой данных не работает и css не загружается - Nginx обратный прокси-сервер для Mon go Node-приложение, использующее Docker, не работает должным образом - PullRequest
0 голосов
/ 06 августа 2020

Все отлично работает без использования nginx. Я сделал приложение с несколькими контейнерами Docker, используя mongodb, node, express и nginx. Я обслуживаю свой сайт через обратный прокси. Теперь проблема в том, что соединение с базой данных работает для вкладки обзоров, так как оно показывает обзоры, полученные из базы данных, но не для других вкладок, а также css не работает для некоторых вкладок. Вот мой файл docker -compose:

version: "3"
services:
  app:
    container_name: visualization_app
    restart: always
    build: .
    volumes:
      - .:/usr/src/app
    ports:
      - "4000:4000"
    links:
      - database
  database:
    container_name: mongo
    image: mongo
    ports:
      - "27011:27017"
  proxy:
    image: nginx:1.17
    restart: unless-stopped
    ports:
      - "8000:80"
    volumes:
      - ../nginx_conf/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - app

Вот мой файл nginx default.conf:

server{
    listen 80;
    location / {
        proxy_pass          http://app:4000;
        proxy_set_header    X-Real-IP   $remote_addr;
        proxy_set_header    X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header    X-Forwarded-Proto http;
        proxy_set_header    Host    $http_host;
        client_max_body_size 17m;
        proxy_http_version  1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header    Connection "upgrade";
    }
}

Вот мой Docker -файл:

FROM node:latest as build-stage
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app
RUN npm install
COPY . /usr/src/app
CMD ["server.js","store.js"]

Вот мой сервер. js файл:

    allQueries=require('./query/allQueries')
    require('./store')
    const Express=require('express')
    const app=Express()
    const fs=require('fs')
    const path=require('path')
    const positiveList=fs.readFileSync('./public/data_files/positives.txt',{encoding:'utf-8', flag:'r'}).split('\r\n')
    const negativeList=fs.readFileSync('./public/data_files/negatives.txt',{encoding:'utf-8',flag:'r'}).split('\r\n')
    const aspectList=fs.readFileSync('./public/data_files/all-aspects.txt',{encoding:'utf-8',flag:'r'}).split('\r\n')
    const aspect_groups=fs.readFileSync('./public/data_files/aspect-groups.txt',{encoding:'utf-8',flag:'r'}).split('\r\n')
    const asin_name_mobile=require(path.resolve('./public/asin_name_mobile.json'))
    
    //Modifying asin_name_mobile file
    for(var prop in asin_name_mobile){
        if(Object.prototype.hasOwnProperty.call(asin_name_mobile,prop)){
            var pName=asin_name_mobile[prop]
            const features=pName.split('(')[1].split(',')
            pName=pName.split('(')[0].trim()
            var ram="-1",storage="-1"
            for(j=0;j<features.length;j++){
                if(features[j].indexOf("RAM")!=-1){
                    ram=features[j]
                }
                if(features[j].indexOf("Storage")!=-1){
                    storage=features[j]
                }
            }
            if(ram!=="-1"&&storage!=="-1"){
                pName=pName+"("+ram+","+storage+")"
            }
            if(ram!=="-1"&&storage==="-1"){
                pName=pName+"("+ram+")"
            }
            if(ram==="-1"&&storage!=="-1"){
                pName=pName+"("+storage+")"
            }
            asin_name_mobile[prop]=pName
        }
    }
    
    //Setting up the various default paths
    app.use(Express.static(path.join(__dirname, '/public'),{index:'dashboard.html'}));
    app.set('views', path.join(__dirname, '/views'));
    app.engine('html', require('ejs').renderFile);
    app.set('view engine', 'html');
    
    //Aspect count in bubble
    app.get('/pstats',async (req,res)=>{
        const Query=req.query
        const group_mapping=[]
    
        //The group name and names under it will be stored in the above array in form of object.
        for(i=0;i<aspect_groups.length-1;i++){
            const obj={}
            var temp=aspect_groups[i].split(':')
            obj.name=temp[0].trim()
            temp=temp[1].split(',')
            for(j=0;j<temp.length;j++){
                temp[j]=temp[j].trim()
            }
            obj.list=temp
            group_mapping.push(obj)
        }
        try{
            var data=await allQueries.getAspectsProductId(Query.productId)
            var dataObjectArray=[]
            for(i=0;i<group_mapping.length-1;i++){
                const obj={
                    "Name":group_mapping[i].name,
                    "Count":0
                }
                dataObjectArray.push(obj)
            }
            for(i=0;i<group_mapping[group_mapping.length-1].list.length;i++){
                const obj={
                    "Name":group_mapping[group_mapping.length-1].list[i],
                    "Count":0
                }
                dataObjectArray.push(obj)
            }
            data.aspectCount.forEach((value, key) => { 
                for(i=0;i<group_mapping.length-1;i++){
                    for(j=0;j<group_mapping[i].list.length;j++){
                        if(key===group_mapping[i].list[j]){
                            key=group_mapping[i].name
                        }
                    }
                }
                for(i=0;i<dataObjectArray.length;i++){
                    if(key===dataObjectArray[i].Name){
                        dataObjectArray[i].Count=dataObjectArray[i].Count+value
                    }
                }
            });
            console.log(dataObjectArray)
            res.render("bubble.ejs",{data:dataObjectArray})
        }catch{
            res.sendStatus(404)
        }
    })
    
    //Single product positive, negative info in bar
    app.get('/bar',async (req,res)=>{
        const Query=req.query
        try{
            var data=await allQueries.getOpinionCount(Query.productId,Query.aspect)
            var dataObjectArray=[]
            obj={
                "name":"Positive",
                "value":data.Positive
            }
            dataObjectArray.push(obj)
            obj={
                "name":"Negative",
                "value":data.Negative
            }
            dataObjectArray.push(obj)
            obj={
                "name":"Neutral",
                "value":data.Neutral
            }
            dataObjectArray.push(obj)
            res.render("bar.ejs",{data:dataObjectArray})
        }catch{
            console.log(505)
        }
    })
    
    //Product Review Marking
    app.get('/reviews',async (req,res)=>{
        const Query=req.query
        try{
            var data=await allQueries.getAspectExamples(Query.aspect,Query.productId,Query.polarity)
            res.render("review.ejs",{
                data:data,
                aspect:Query.aspect,
                positiveList:positiveList,
                negativeList:negativeList})
        }catch{
            res.sendStatus(505)
        }
    })
    
    //Aspect count in Bubble
    app.get('/cstats',async (req,res)=>{
        const Query=req.query
        try{
            var data=await allQueries.getAspectCategory(Query.category)
            var dataObjectArray=[]
            data.aspect.forEach((value, key) => { 
                const obj={
                    "Name":key,
                    "Count":value
                }
                dataObjectArray.push(obj)
            });
            res.render("bubble.ejs",{data:dataObjectArray})
        }catch{
            res.sendStatus(505)
        }
    })
    
    app.get('/dashboard',async(req,res)=>{
        const Query=req.query
        aspectQuality=[]
        maxClass={
            nMin:Number.MAX_VALUE,
            pMax:Number.MIN_VALUE,
            neutralMax:0
        }
        for(var i=0;i<aspectList.length;i++){
            data=await allQueries.getOpinionCount(Query.productId,aspectList[i])
            if(aspectList[i]=='')
                aspectList[i]='other'
            data.name=aspectList[i]
            var obj={
                group:"Positive",
                value:data.Positive,
                aspect:data.name
            }
            aspectQuality.push(obj)
            obj={
                group:"Negative",
                value:-data.Negative,
                aspect:data.name
            }
            aspectQuality.push(obj)
            obj={
                group:"Neutral",
                value:data.Neutral,
                aspect:data.name
            }
            aspectQuality.push(obj)
            obj={
                group:"FinalScore",
                value:data.FinalScore,
                aspect:data.name
            }
    
            //Finding the Maximum and Minimum values
            maxClass.nMin>-data.Negative?maxClass.nMin=-data.Negative:maxClass.nMin
            maxClass.pMax<data.Positive?maxClass.pMax=data.Positive:maxClass.nMax
            maxClass.nMin>-data.FinalScore?maxClass.nMin=-data.FinalScore:maxClass.nMin
            maxClass.pMax<data.FinalScore?maxClass.pMax=data.FinalScore:maxClass.nMax
            maxClass.neutralMax<data.Neutral?maxClass.neutralMax=data.Neutral:maxClass.neutralMax
            
            aspectQuality.push(obj)
        }
        x_axis=['Positive','Negative','Neutral','FinalScore']
        res.render('heatmap.ejs',{data:aspectQuality,aspects:aspectList,maxData:maxClass,x_axis:x_axis})
    })
    
    app.get('/comparison',async(req,res)=>{
        aspectLevel=[]
        parent={
            name:"Aspect"
        }
        for(var i=0;i<aspectList.length;i++){
            if(aspectList[i]==='')
                aspectList[i]='other'
            productLevel=[]
            for(var p in asin_name_mobile){
                aspectQuality=[]
                var data=await allQueries.getOpinionCount(p,aspectList[i])
                var obj={
                    name:"Positive",
                    size:data.Positive,
                }
                aspectQuality.push(obj)
                obj={
                    name:"Negative",
                    size:data.Negative,
                }
                aspectQuality.push(obj)
                obj={
                    name:"Neutral",
                    size:data.Neutral,
                }
                aspectQuality.push(obj)
                obj={
                    name:"FinalScore",
                    size:data.FinalScore,
                }
                aspectQuality.push(obj)
                var finalObject={
                    name:asin_name_mobile[p],
                    children:aspectQuality
                }
                productLevel.push(finalObject)
            }
            var finalObject={
                name:aspectList[i],
                children:productLevel
            }
            aspectLevel.push(finalObject)
        }
        parent.children=aspectLevel
        res.render('zoomable.ejs',{data:parent})
    })
    
    app.get('/productAspect',async (req,res)=>{
        product_aspect=[]
        max_min={
            nMin:Number.MAX_VALUE,
            pMax:Number.MIN_VALUE,
            neutralMax:0
        }
        const prodNames=[]
        var count=0
        for(p in asin_name_mobile){
            for(var i=0;i<aspectList.length;i++){
                data=await allQueries.getOpinionCount(p,aspectList[i])
                if(aspectList[i]=='')
                    aspectList[i]='other'
                data.name=aspectList[i]
                var obj={
                    group:asin_name_mobile[p],
                    value:data.FinalScore,
                    aspect:data.name
                }
                product_aspect.push(obj)
                max_min.nMin=Math.min(data.FinalScore,max_min.nMin)
                max_min.pMax=Math.max(data.FinalScore,max_min.pMax)
            }
            prodNames.push(asin_name_mobile[p])
            count=count+1
            if(count>10)
                break
        }
        res.render('heatmap.ejs',{data:product_aspect,aspects:aspectList,maxData:max_min,x_axis:prodNames})
    })
    
    app.get('/product',(req,res)=>{
        res.send(asin_name_mobile)
    })
    
    app.listen(4000,()=>{
        console.log('server is listening on port 4000')
})

Вот мой коннект. js файл:

//Connection Parameters
const MongoClient=require('mongodb').MongoClient
const url = 'mongodb://database:27017'
const dbName='ReviewASP'
module.exports=new Promise((resolve,reject)=>{

    //Connecting to already running Database by providing URL
    MongoClient.connect(url, {useUnifiedTopology: true },(err,client)=>{
        if(err){
            console.log('Unable to connect to database')
            reject(err)
        }
        console.log('Connected to database successfully')
        const db = client.db(dbName)
        resolve(db)
    })
})

Моя структура проекта выглядит так:

Кроме того, меня интересует еще одна вещь: нужно ли мне копировать файлы проекта в специальную c папку из nginx, чтобы правильно использовать обратный прокси?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...