角度 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 build
和docker-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的主要内容,如果未能解决你的问题,请参考以下文章