node-mssql "connection is closed" 当 运行 Mocha 测试时,但在应用程序中运行良好
node-mssql "connection is closed" when running Mocha test, but runs fine in app
我有一个 node.js 数据处理应用程序,可以从 mssql 中提取一些数据。它 运行 很好并产生了预期的结果。但是,集成测试不起作用,我希望它们能起作用。
下面是连接管理和测试查询功能。我可以从调试器中的输出和 运行ning 中看到测试有 运行 并且在数据库连接之前失败。所以我的 Mocha 异步设置似乎不起作用,但它看起来像我在文档中看到的所有内容。
节点-v
v10.15.0
柴:“^4.2.0”,
摩卡咖啡:“^5.2.0”
mssql: "^4.3.0",
const config = require('./config')
const _ = require('underscore')
const sql = require('mssql')
sql.on('error', err => {
console.error('SQL Error', err)
})
let api = {}
api.connect = async dbConfig => {
return new sql.ConnectionPool(dbConfig).connect(
err => {
if (err)
console.error('Connection error', err)
else
console.log('connected')
})
}
var connecting = api.connect(config.sql)
api.simple = async () => {
let pool = await connecting
let result = await pool.request().query('select 1 as number')
return result.recordset[0].number
}
module.exports = api
这是我失败的 mocha 测试
const { expect } = require('chai')
const data = require('../src/data')
describe('data access', function () {
it('is simple', async function () {
const yo = await data.simple()
expect(yo).to.exist
expect(yo).to.equal(1)
})
})
我也尝试过使用 done 回调的老式异步 mocha 测试
it('is simple oldschool', function (done) {
data.simple()
.then(function(yo){
expect(yo).to.exist
expect(yo).to.equal(1)
done()
})
})
无论我将 Mocha 的超时设置多长时间(我试过高达 60 秒)都会超时
我已经无计可施了,有人发现有什么不对吗?
我认为您的数据库连接存在竞争条件。
我在 before()
before((done) => {
server.on("serverStarted", function() {
done();
});
});
然后在我的服务器(我正在使用节点)中,当我连接时发出:
var port = process.env.PORT || 3030;
var server = http.listen(port, function(){
console.log('listening on port: ' + port);
db.connect().then(() => {
console.log("Connect to database successful");
server.emit("serverStarted") // HERE IT IS
}).catch(err => {
console.error(err);
console.log("Cannot connect to database");
process.exit(1);
});
});
希望这对您有所帮助。这个我拔了一些头发。
api.connect
可以 return 在连接实际完成之前。像这样重写它将确保 ConnectionPool.connect
可以在 api.connect
承诺解决之前完成。
api.connect = dbConfig =>
new Promise((resolve, reject) => {
const pool = new sql.ConnectionPool(dbConfig);
pool.connect(err => {
if (err) {
console.error("Connection error", err);
return reject(err);
}
return resolve(pool);
});
});
除此之外,我对let pool = await c3
感到困惑;您粘贴的代码中没有符号 c3
...
我有一个 node.js 数据处理应用程序,可以从 mssql 中提取一些数据。它 运行 很好并产生了预期的结果。但是,集成测试不起作用,我希望它们能起作用。
下面是连接管理和测试查询功能。我可以从调试器中的输出和 运行ning 中看到测试有 运行 并且在数据库连接之前失败。所以我的 Mocha 异步设置似乎不起作用,但它看起来像我在文档中看到的所有内容。
节点-v v10.15.0
柴:“^4.2.0”, 摩卡咖啡:“^5.2.0” mssql: "^4.3.0",
const config = require('./config')
const _ = require('underscore')
const sql = require('mssql')
sql.on('error', err => {
console.error('SQL Error', err)
})
let api = {}
api.connect = async dbConfig => {
return new sql.ConnectionPool(dbConfig).connect(
err => {
if (err)
console.error('Connection error', err)
else
console.log('connected')
})
}
var connecting = api.connect(config.sql)
api.simple = async () => {
let pool = await connecting
let result = await pool.request().query('select 1 as number')
return result.recordset[0].number
}
module.exports = api
这是我失败的 mocha 测试
const { expect } = require('chai')
const data = require('../src/data')
describe('data access', function () {
it('is simple', async function () {
const yo = await data.simple()
expect(yo).to.exist
expect(yo).to.equal(1)
})
})
我也尝试过使用 done 回调的老式异步 mocha 测试
it('is simple oldschool', function (done) {
data.simple()
.then(function(yo){
expect(yo).to.exist
expect(yo).to.equal(1)
done()
})
})
无论我将 Mocha 的超时设置多长时间(我试过高达 60 秒)都会超时
我已经无计可施了,有人发现有什么不对吗?
我认为您的数据库连接存在竞争条件。
我在 before()
before((done) => {
server.on("serverStarted", function() {
done();
});
});
然后在我的服务器(我正在使用节点)中,当我连接时发出:
var port = process.env.PORT || 3030;
var server = http.listen(port, function(){
console.log('listening on port: ' + port);
db.connect().then(() => {
console.log("Connect to database successful");
server.emit("serverStarted") // HERE IT IS
}).catch(err => {
console.error(err);
console.log("Cannot connect to database");
process.exit(1);
});
});
希望这对您有所帮助。这个我拔了一些头发。
api.connect
可以 return 在连接实际完成之前。像这样重写它将确保 ConnectionPool.connect
可以在 api.connect
承诺解决之前完成。
api.connect = dbConfig =>
new Promise((resolve, reject) => {
const pool = new sql.ConnectionPool(dbConfig);
pool.connect(err => {
if (err) {
console.error("Connection error", err);
return reject(err);
}
return resolve(pool);
});
});
除此之外,我对let pool = await c3
感到困惑;您粘贴的代码中没有符号 c3
...