【问题标题】:Mongoose throws error ECONNREFUSED on Apollo-Express serverMongoose 在 Apollo-Express 服务器上抛出错误 ECONNREFUSED
【发布时间】:2021-04-15 02:41:55
【问题描述】:

如果这个问题是愚蠢或愚蠢的,我很抱歉,请指出正确的方向,非常感谢每一点帮助。

我目前正在使用 expressmongoose 构建 Apollo-Server。我让服务器使用 GraphQL 运行,但在使用 mongoose 连接后,它看起来像这样:

const express = require("express");
const { ApolloServer, gql } = require("apollo-server-express");
const fs = require("fs");

const port = 4000;
const path = "/graphql";

const app = express();

const typeDefs = gql(fs.readFileSync("./schema.graphql", { encoding: "utf8" }));

const resolvers = require("./resolvers");

const mongo = require('./config');
const { User } = require('./models');

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

server.applyMiddleware({ app, path });

app.listen(port, () => console.info(`Server started on port ${port}`));

将此作为我的配置:

const mongoose = require('mongoose');
mongoose.Promise = global.Promise;

const url = 'mongodb://localhost:27017/graphql';
const options = {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
  useCreateIndex: true,
};

//mongoose.connect(url, options);
//mongoose.connection.once('open', () => console.log("Connected to mongoDB at ${url}"));

var connectWithRetry = function () {
  return mongoose.connect(url, options, function (err) {
    if (err) {
      console.error(
        "Failed to connect to mongo on startup - retrying in 5 sec\n\n",
        err
      );
      setTimeout(connectWithRetry, 5000);
    }
    mongoose.connection.once("open", () =>
      console.log(`Connected to mongo at ${Constants.mongodbUrl}`)
    );
  });
};

connectWithRetry();

这应该可以正常工作吗? 但是当我打电话给npm start server.js 时,我收到以下错误:

npm start server.js

> start
> node server.js "server.js"

Server started on port 4000
Failed to connect to mongo on startup - retrying in 5 sec MongooseServerSelectionError: connect ECONNREFUSED 127.0.0.1:27017
    at NativeConnection.Connection.openUri (/Users/myUsername/newServer/server/node_modules/mongoose/lib/connection.js:832:32)
    at /Users/myUsername/newServer/server/node_modules/mongoose/lib/index.js:345:10
    at promiseOrCallback (/Users/myUsername/newServer/server/node_modules/mongoose/lib/helpers/promiseOrCallback.js:9:12)
    at Mongoose._promiseOrCallback (/Users/myUsername/newServer/server/node_modules/mongoose/lib/index.js:1135:10)
    at Mongoose.connect (/Users/myUsername/newServer/server/node_modules/mongoose/lib/index.js:344:20)
    at connectWithRetry (/Users/myUsername/newServer/server/config.js:16:19)
    at Object.<anonymous> (/Users/myUsername/newServer/server/config.js:30:1)
    at Module._compile (node:internal/modules/cjs/loader:1108:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10)
    at Module.load (node:internal/modules/cjs/loader:973:32)
    at Function.Module._load (node:internal/modules/cjs/loader:813:14)
    at Module.require (node:internal/modules/cjs/loader:997:19)
    at require (node:internal/modules/cjs/helpers:92:18)
    at Object.<anonymous> (/Users/myUsername/newServer/server/server.js:14:15)
    at Module._compile (node:internal/modules/cjs/loader:1108:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1137:10) {
  reason: TopologyDescription {
    type: 'Unknown',
    setName: null,
    maxSetVersion: null,
    maxElectionId: null,
    servers: Map(1) { 'localhost:27017' => [ServerDescription] },
    stale: false,
    compatible: true,
    compatibilityError: null,
    logicalSessionTimeoutMinutes: null,
    heartbeatFrequencyMS: 10000,
    localThresholdMS: 15,
    commonWireVersion: null
  }
}

如果你需要我安装的 npm-packages:

graphql-node-server@ /path/server
├── apollo-server@2.19.1
├── express@4.17.1
├── graphql@15.4.0
├── mongodb@3.6.3
├── mongoose@5.11.11
└── nodemon@2.0.7

【问题讨论】:

  • 代码对我来说看起来不错。确保 Mongodb 正在您的本地计算机上运行,​​因为这是唯一的情况。
  • 这是我的问题之一,我没有写...我怎么办?
  • 天哪,太尴尬了,我以为猫鼬会为我启动这个过程。如果您想手动回答,我很乐意给您正确答案
  • 是的,您需要启动该服务。我确实从我的最后检查了它,你的代码对我来说工作正常。
  • 是的,它有时会这样做,我查看了启动 mongoldb 进程的命令,我工作得很好。

标签: javascript node.js mongodb mongoose graphql


【解决方案1】:

您需要在运行代码之前启动 MongoDB 服务。如果它没有运行,那么它将处于尝试重新连接的连续循环中。

同样,当它被连接时,open 事件将不会被触发。你需要把它移到你的连接函数之外,所以它应该是这样的。

var connectWithRetry = function () {
    return mongoose.connect(url, options, function (err) {
        if (err) {
            console.error(
                "Failed to connect to mongo on startup - retrying in 5 sec\n\n",
                err
            );
            setTimeout(connectWithRetry, 5000);
        }
    });
};
mongoose.connection.once("open", () =>
    console.log(`Connected to mongo at ${url}`)
);

connectWithRetry();

【讨论】:

    【解决方案2】:

    我的错误是,我需要手动启动 mongoDB 进程。如果您没有,请重新启动它,对我来说解决了这个问题。

    mongod --config /usr/local/etc/mongod.conf --fork
    

    【讨论】:

      猜你喜欢
      • 2020-07-03
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2020-07-30
      • 2021-03-18
      • 2021-09-23
      • 2020-04-12
      • 1970-01-01
      相关资源
      最近更新 更多