Все отлично работает без использования 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, чтобы правильно использовать обратный прокси?