有点长问题。已经调试了近两天了,我想我可能最终找到了2个可能的问题。
我正在尝试做的是使用mongoose使用graphql,express和mongo。听起来很简单?连接到mongo服务器和异步函数有一些问题,我相信它可能与docker-compose links
有关?
首先,我正在玩的Docker-compose结构非常基本
version: "3"
services:
db:
build:
context: '.docker/mongo'
environment:
- MONGODB_USER="root"
- MONGODB_PASS="root"
volumes:
- ./.docker/mongo-data:/data/db
ports:
- 27017:27017
node-cli:
build:
context: '.docker/pm2'
working_dir: /var/www
volumes:
- ./:/var/www
environment:
- ENV=$ENV
- KEYMETRICS_PUBLIC=$KEYMETRICS_PUBLIC
- KEYMETRICS_SECRET=$KEYMETRICS_SECRET
links:
- db
ports:
- 3000:3000
nginx:
build:
context: '.docker/nginx'
ports:
- 80:80
- 43554:43554
- 443:443
environment:
- NGINX_HOST=$NGINX_HOST
links:
- db
- node-cli
您会注意到容器是一个'node-cli',这是我在keymetrics/pm2-docker-alpine:latest
上运行的快速应用程序,有一个nginx,我现在根本就没有使用它;现在提到它,因为它有一些相关性,因为pm2
没有bash to ssh。
我的快递应用:
import express from 'express';
import graphqlHTTP from 'express-graphql';
import schema from './schema';
// const root = {
// hello: 'heel',
// users: {
// id: 1,
// firstname: 'test',
// lastname: 'tester',
// },
// };
const app = express();
app.use('/', graphqlHTTP({
schema: schema,
//rootValue: root,
graphiql: true,
}));
app.listen(3000, () => console.log('Running server on 3000'));
我的db文件
import mongoose from 'mongoose';
import config from './config';
console.log('db config', config.config);
mongoose.connect(config.url, config.config, (error, db) => {
if (error) {
console.error('db error', error);
} else {
console.log('db success');
}
});
mongoose.Promise = global.Promise;
const db = mongoose.connection;
export default db;
除了mongo连接之外,所有“看起来”都可以找到工作。在pm2日志中,我可以看到MongoError: failed to connect to server [localhost:27017] on first connect [MongoError: connect ECONNREFUSED 127.0.0.1:27017]
。所以看起来有连接问题?我在我的主机上安装了mongodb并运行mongo --host mongodb://localhost:27017/test
和boom:连接正常。然后我读了一些关于端口的东西,所以我检查了在docker中运行的mongodb命令,这是mongod --bind_ip_all
并检查我可以使用127.0.0.1:27017
从我的主机连接到数据库而且工作正常!
然后我想知道docker的链接是否关闭了,所以我在nginx
容器上安装了mongodb并试图连接到数据库和Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
所以看起来从另一个容器连接到docker容器有问题?我用mysql和php容器构建了类似的设置,所以我不确定为什么在链接容器时我无法从另一个容器连接到mongo容器?
我目睹的另一个可能的问题可能是异步等待函数但是我没有与它们相关的错误,除了服务器挂起时请求如下所示的解决方案:
resolve: async (root, params, options, fieldASTs) => {
const projection = getProjection(fieldASTs);
console.log('select', projection);
console.log('before await');
const results = await userModel.find()
.select(projection)
.exec((error, result) => {
console.log('hello!');
console.log('error', error);
console.log('results', result);
});
console.log('success');
return results;
},
在pm2日志中,我在等待之前到达,然后它就在那里悬挂。 Graphiql只是坐在那里取物。这可能是因为没有数据库连接,我应该关闭/退出流程?
版本:
pm2god:2.5.0
蒙戈:
MongoDB shell version v3.6.0
git version: a57d8e71e6998a2d0afde7edc11bd23e5661c915
OpenSSL version: OpenSSL 1.0.1t 3 May 2016
allocator: tcmalloc
modules: none
build environment:
distmod: debian81
distarch: x86_64
target_arch: x86_64
因为:くzxswい
包:
8.1.3
mongo docker(最新):{
"name": "testgql",
"version": "1.0.0",
"main": "dist/index.js",
"license": "MIT",
"scripts": {
"start": "webpack --config=webpack.config.js --progress --watch"
},
"dependencies": {
"express": "^4.16.2",
"express-graphql": "^0.6.11",
"graphql": "^0.12.3",
"mongoose": "^4.13.7"
},
"devDependencies": {
"babel-polyfill": "^6.26.0",
"babel-preset-env": "^1.6.1",
"webpack": "^3.10.0"
}
}
我也刚刚在docker设置之外运行了应用程序,它完美无缺!还连接到数据库,所以它肯定与docker容器没有绑定
您不能使用节点应用程序中的https://hub.docker.com/_/mongo/连接到localhost
容器。
检查mongo
docker-compose
网络功能。
默认情况下,Compose为您的应用设置单个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以在与容器名称相同的主机名上发现。
您需要使用节点应用程序中的docs。
从主机连接的原因是因为您使用db:27017
指定了port mappings。