角度 5 nginx mongoose docker ERR_EMPTY_RESPONSE

Posted

技术标签:

【中文标题】角度 5 nginx mongoose docker ERR_EMPTY_RESPONSE【英文标题】:angular 5 nginx mongoose docker ERR_EMPTY_RESPONSE 【发布时间】:2018-06-08 14:33:47 【问题描述】:

通过以下设置,我可以看到我的网站,但我在尝试注册时收到 ERR_EMPTY_RESPONSE。

当我注册时,我正在向API.js 发出 HTTP 请求 它在user.js 中创建/更新架构。

这通常在不使用 Docker/nginx 时有效。 我尝试直接连接到容器图像“mongo”,我尝试了0.0.0.0:27017 ,但我感觉我的 app.js 最初并没有连接到 Mongodb。

即使到/main /profile 等的路由仍然有效。所以我假设 app.js 已通过 index.html 调用

我觉得完成这项工作是一件小事,但现在花了几个小时,我很挣扎。我没有使用 CORS,因为我使用的是 Nginx。我对这些概念很陌生,但我认为 Nginx 作为反向代理不使用 CORS?

docker-compose.yml 中,当我将卷的目录更改为不存在的目录时,没有任何变化我仍然可以看到我的网站,好像它什么也没做,但是当我删除它给出的句子时我失败了,所以它被称为。不完全确定卷在此文件中的作用。

docker ps 给我以下输出:

 CONTAINER    ID             IMAGE  COMMAND           CREATED           STATUS              PORTS             NAMES

 f58507ed0205 meanchat_web   "nginx -g 'daemon ..."   55 seconds ago      Up 54 seconds       0.0.0.0:80->80/tcp               meanchat_web_1

 cddfd8180f1b        meanchat_node       "nginx -g 'daemon ..."   2 hours ago         Up 55 seconds       80/tcp, 0.0.0.0:3000->3000/tcp   meanchat_node_1

 79a013dd4e51        mongo               "docker-entrypoint..."   2 hours ago         Up 55 seconds       0.0.0.0:27017->27017/tcp         meanchat_mongo_1

app.js:

 var mongo= require('mongodb');

//var cors = require('cors');
 var mongoose = require('mongoose');

 var connect = require('./models/user')
 connect.connect('mongodb://localhost/loginapp');
 var db = mongoose.connection;

user.js:

 module.exports.connect = function(mongoUri, promiseLib)

 var mongoDB = mongoose.connect(mongoUri);
  return mongoDB
  ;

DockerFile:

 ### STAGE 1: Build ###

 # We label our stage as ‘builder’
 FROM node:8.1.4-alpine as builder

 COPY package.json package-lock.json ./

 ## Storing node modules on a separate layer will prevent unnecessary 
 pm installs at each build
 RUN npm i && mkdir /ng-app && cp -R ./node_modules ./ng-app

 WORKDIR /ng-app

 COPY . .

 ## Build the angular app in production mode and store the artifacts
 in dist folder
 RUN $(npm bin)/ng build --prod
 ### STAGE 2: Setup ###

 FROM nginx:1.13.3-alpine

 ## Copy our default nginx config
 COPY nginx/default.conf /etc/nginx/conf.d/

 ## Remove default nginx website
 RUN rm -rf /usr/share/nginx/html/*

 ## From ‘builder’ stage copy over the artifacts in dist folder to default
 nginx public folder
 COPY --from=builder ./dist /usr/share/nginx/html

 CMD ["nginx", "-g", "daemon off;"]

docker-compose.yml:

 version: '3'
 services:
 web:
  build: ./
  ports:
  - "80:80"
  links:
  - node
  volumes:
   - "./dist :/usr/share/nginx/html"
 node:
  build: ./
  ports:
  - "3000:3000"
   links:
   - mongo
 mongo:
 image: mongo
 ports: 
 - "27017:27017"

main.ts:

【问题讨论】:

【参考方案1】:

我可以从 compose 输出中看到 mongo 在您的 app.js 中未正确连接。

将此行connect.connect('mongodb://localhost/loginapp'); 更改为

connect.connect('mongodb://mongo/loginapp');

然后运行docker-compose builddocker-compose up,它应该会连接。

【讨论】:

我尝试了上面的方法,但它不起作用,我添加了一个用户帐户以摆脱用户允许访问的问题,现在已经消失了,但是我仍然收到 err-empty 消息尝试访问 mongodb 服务器时。有没有办法关闭 mongodb 上的访问控制,或者还有什么可能是 mongoose 在 mongodb 上不起作用的原因。虽然它正在登录 mongodb。 你能提供一个堆栈跟踪吗?没有看到错误真的很难提供帮助。 嗨,迈克。我将尝试弄清楚如何获取堆栈跟踪,当涉及到 http 调用时,我从浏览器控制台收到的警告通常提供的信息很少。有没有办法从服务器 api.js 获取更多堆栈跟踪信息?例如,当我在 api 上调用的方法中放置一个 console.log 时,我根本看不到任何日志。正如你所见,我并不擅长调试 ? 加载资源失败:net::ERR_EMPTY_RESPONSE main.1562976….bundle.js:1 t 错误:ProgressEvent isTrusted: true, lengthComputable: false, loaded: 0, total: 0, type: “错误”,...标头:e normalizedNames:Map(0),lazyUpdate:null,标头:Map(0)消息:“(未知url)的Http失败响应:0未知错误”名称:“HttpErrorResponse”确定:错误状态:0 statusText:“未知错误”网址:null proto:Object【参考方案2】:

图像 mongo 未连接。

你应该使用

connect.connect('mongodb:27017//localhost/db'); 

连接到数据库。

【讨论】:

嗨 Roman,刚刚在输出中注意到它涉及 dbpath = data/db,我认为你所说的 db 是数据库名称 loginapp。所以在我的例子中,我创建了一个 loginapp(use loginapp),正确的行会变成:connect.connect('mongodb:27017//localhost/db/loginapp')?【参考方案3】:

我尝试了您的两个选项,但结果似乎相同,我再次发送了输出。我确实做了你提到的 docker-compose build 和 docker-compose up。

我正在执行以下获取 api 以注册到 mongodatabase 的操作。

 let url = 'http://localhost:3000/api/register';
 return this.http.post(url, user)

我可以通过 D:/mongodb/bin 文件夹中的 mongo://0.0.0.0:27017 连接到容器中的 mongodb。它确实给了我警告:没有为数据库启用访问控制。

我关闭了防火墙,但 atm 中没有激活任何杀毒软件。

我用谷歌搜索了我收到的访问控制警告,这似乎表明我需要在 mongodb 上创建一个授权帐户? 即使使用 Mongoose 也需要这样做,没有 docker/nginx 我没有这个问题。可能和mongodb的形象有关?

我通过登录数据库添加了一个管理员帐户: $ 使用登录应用程序 $ db.createUser( 用户:“用户名”, 密码:“密码”, 角色:[角色:“root”,db:“admin”] )

mongo:
  environment:
  - MONGO_INITDB_ROOT_USERNAME=username
  - MONGO_INITDB_ROOT_PASSWORD=password
image: mongo
ports: 
- "27017:27017"

现在我可以在没有访问控制未启用消息的情况下连接到数据库,但是当我尝试注册时,我仍然得到相同的 ERR_empty_response。那么有没有办法完全摆脱访问控制,或者我必须在 mongoose 的架构中添加一些东西,以便当我尝试在 LoginApp 上更改或创建用户时,它可以正确地进行身份验证?

newUser.save forinstance 现在可能不起作用,因为它需要单独的身份验证?

下面的图片是我现在得到的,但是进入 mongoose 数据库仍然不起作用。

【讨论】:

以上是关于角度 5 nginx mongoose docker ERR_EMPTY_RESPONSE的主要内容,如果未能解决你的问题,请参考以下文章

以角度(mongoose/mongodb)更新模型,特别是作为模型属性的对象数组

Docke容器分离部署LNMP

以角度 5 在 HTML 上显示来自 json 对象的数据

Docke--Dockerfile 构建LNMP环境

Docker运行nginxmysqlzookeeper

docker安装nginx,tomcat,elasticsearch