【问题标题】:Can't connect to mongoose on test environment无法在测试环境中连接到猫鼬
【发布时间】:2021-07-15 01:20:24
【问题描述】:

我有一个使用 mongodb 在 docker 中运行的节点应用程序,它在开发环境中运行良好。但是,我正在使用 mocha 和 chai 创建一些测试,并且在运行这些测试时无法连接到 mongo。

我要测试的功能是:

const Interactor = require("interactor");
const Donation = require("../models/donations");

module.exports = class CreateDonation extends Interactor {
  async run(context) {
    this.context = context;
    this.donation = new Donation.Model({
      donationId: context.id,
      status: context.status,
      amount: context.chargeInfo.donatedValue,
      donatorEmail: context.donatorInfo.email,
      source: context.source,
    });

    await this.donation.save();
  }

  rollback() {
    Donation.Model.findOneAndRemove({ donationId: this.context.id });
  }
};

我的测试:

/* eslint-disable no-unused-vars */
/* eslint-disable no-undef */
const chai = require("chai");
const chaiHttp = require("chai-http");
const CreateDonation = require("../../interactors/create-donation");
require("../../config/db");

const should = chai.should();
const { expect } = chai;

chai.use(chaiHttp);

describe("CreateDonation", () => {
  it("Creates a donation when context passed is correct", async (done) => {
    const context = {
      id: "123123",
      status: "AUTHORIZED",
      chargeInfo: {
        donatedValue: 25.0,
      },
      donatorInfo: {
        email: "test@example.com",
      },
      source: "CREDIT_CARD",
    };
    const result = await CreateDonation.run(context);
    console.log(result);
    done();
  });
});

我的数据库配置文件:

const mongoose = require("mongoose");
require("dotenv/config");

mongoose
  .connect("mongodb://db:27017/donations", {
    useNewUrlParser: true,
    useUnifiedTopology: true,
    reconnectInterval: 5000,
    reconnectTries: 50,
  })
  .then(() => {
    console.log("good");
  })
  .catch((err) => {
    console.log(err);
  });
mongoose.Promise = global.Promise;

module.exports = mongoose;

我从上面的测试中得到的错误是:

MongooseServerSelectionError: getaddrinfo ENOTFOUND db

我做错了什么?我是不是想导入一些东西?

【问题讨论】:

  • 请附上您的 docker-compose 文件以及您为运行应用程序和测试它而运行的命令

标签: node.js express mongoose mocha.js chai


【解决方案1】:

当您使用 docker compose 文件在 docker 中运行服务时,它们会根据您在 docker-compose 文件中为服务编写的名称获得主机名。

例子:

version: "3.9"
services:
  web:
    build: .
    ports:
      - "5000:5000"
  redis:
    image: "redis:alpine"

在本例中,web 服务可以通过 redis hostname 到达 redis db。

如果以这种方式更改服务名称:

  db:
    image: "redis:alpine"

Web 服务必须连接到 db 主机。

因此,当您运行撰写文件时,您的 db 服务将通过您的应用服务中的 db 主机名到达。但是,当您在 docker compose 之外运行测试时,db 主机名不可用,您需要使用 localhost 因为您的数据库直接在您的操作系统上运行(或者它在容器内运行,27017 端口映射到主机)。

如果您使用的是 unix 操作系统,则可以在 /etc/hosts 文件中添加别名来解决您的问题:

127.0.0.1 localhost db

通过这种方式,您可以在保持db 连接字符串的情况下运行测试。

否则,这是建议的解决方案,您可以使用环境变量在应用程序启动时更改连接字符串:

mongoose.connect(process.env.MONGO_URI)

并使用它运行它

MONGO_URI=mongodb://db:27017/donations npm start

然后在 docker compose 中你可以使用这个代码添加一个固定的环境变量:

environment:
  - MONGO_URI=mongodb://db:27017/donations

【讨论】:

    【解决方案2】:

    刚发现在测试时,我需要在 mongo 的连接字符串上使用“localhost”(我使用的是来自 docker-compose 的名称)。因此,URI 为“mongodb://localhost:27017/donations”时它起作用了。我不知道为什么。

    【讨论】:

      猜你喜欢
      • 2018-08-26
      • 1970-01-01
      • 2019-10-16
      • 1970-01-01
      • 2020-03-26
      • 2022-12-11
      • 2020-04-03
      • 1970-01-01
      • 2022-01-15
      相关资源
      最近更新 更多