【发布时间】:2018-12-23 05:00:22
【问题描述】:
我正在使用 mongoose 连接到 MongoDB 的快速 API 服务器。
node 启动 index.js,它启动一个 app.js,我在其中进行 MongoDB 设置和快速设置。
在正常开发中工作正常,但是当我尝试使用 jest 测试 API 时,猫鼬在测试完成后完成连接时遇到问题,因此 jest 给了我以下错误。
Jest 在测试运行完成后一秒没有退出。
这通常意味着存在未执行的异步操作 在您的测试中停止。考虑运行 Jest
--detectOpenHandles解决此问题。
我从逻辑上知道这是由于 node.js 的异步特性。我只是不知道如何解决它。我不知道解决方案是否正在重组我运行呼叫的方式或用承诺做某事(我仍然很弱)。
那么我该如何解决这个问题呢? App.js 在下面发布,连接字符串已更改为公开发布。
app.js
import express from 'express';
import path from 'path';
import logger from 'morgan';
import bodyParser from 'body-parser';
import cors from 'cors';
import mongoose from 'mongoose';
import fs from 'fs';
//Bring DB Online
console.log("Brining MongoDB Online")
mongoose.set('debug', true)
const devurl = 'mongodb://mlabuname:mlabpass@ds247170.mlab.com:47170/devdb'
mongoose.connect(devurl, { useNewUrlParser:true }, function() {
console.log('\tMongoDB - Connection has been made');
})
.catch(err => {
console.error('\tApp starting error:', err.stack);
process.exit(1);
});
//Load Models
console.log("\tLoading Mongoose Models")
import User from './models/user'
import Wiki from './models/wiki'
//Express Items
console.log("Brining Express Online")
const app = express();
app.disable('x-powered-by');
app.use(cors());
// View engine setup
app.set('views', path.join(__dirname, '../views'));
app.set('view engine', 'pug');
app.use(logger('dev', {
skip: () => app.get('env') === 'test'
}));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(express.static(path.join(__dirname, '../public')));
// Routes
// Dynamic routes setup by controllers
console.log("\tInstalling Controller Routes")
fs.readdirSync("src/controllers").forEach(function (file) {
if(file.substr(-3) == ".js") {
const route = require("./controllers/" + file)
route.controller(app)
}
})
// Temp ResetDB Route for DEV.
console.log("\tInstalling ResetDB Route")
import resetDB from './routes/resetDB'
app.use('/resetDB', resetDB);
// Default Routes set by the framework, fine for now.
console.log("\tInstalling Default")
import defaultRoutes from './routes/defaultRoutes'
app.use('/', defaultRoutes);
// Catch 404 and forward to error handler
app.use((req, res, next) => {
const err = new Error('Not Found');
err.status = 404;
next(err);
});
// Error handler
app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars
res
.status(err.status || 500)
.render('error', {
message: err.message
});
});
export default app;
更新 我被指出这是重复的。我看到了那个答案,这不是完全相同的问题。首先,他们实际上是在测试模型。在这种情况下,我不是。我只是试图在快速路线上运行测试,并且在测试运行(并通过)后出现错误。
所有发生的事情是系统正在启动 MongoDB,它没有对其进行任何事务作为测试的一部分。 (正如另一个问题所说)。
最后在那个例子中,他们试图在测试本身中调出 mongoose db。我将它作为应用程序启动的一部分来启动(当我在 dev 中运行路由时它会起作用)。
【问题讨论】:
-
我认为这是一个不同的问题。我已编辑问题以解释原因。
-
是否使用模型并不重要。如果存在连接,则需要将其销毁。这个问题还解决了 Mongoose 的开放句柄,stackoverflow.com/a/50820664/3731501
-
啊,好吧,那有帮助。我知道该怎么做。
-
你的测试代码是什么。如果有异步代码,你必须明确告诉 jest