如何解决无法连接到测试环境中的猫鼬
我有一个在 docker 中使用 mongodb 运行的节点应用程序,它在开发环境中运行良好。但是,我正在使用 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 文件在 docker 中运行您的服务时,它们将根据您在 docker-compose 文件中为服务编写的名称获得一个主机名。
示例:
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
在本例中,web
服务可以访问 redis hostname
处的 redis 数据库。
如果以这种方式更改服务名称:
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
,
刚刚发现在测试时,我需要在 mongo 的连接字符串上使用“localhost”(我使用的是来自 docker-compose 的名称)。因此,将 URI 设为“mongodb://localhost:27017/donations”就可以了。我不知道为什么。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。