Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 节点mssql";“连接已关闭”;运行摩卡测试时,但在应用程序中运行良好_Node.js_Async Await_Mocha.js_Node Mssql - Fatal编程技术网

Node.js 节点mssql";“连接已关闭”;运行摩卡测试时,但在应用程序中运行良好

Node.js 节点mssql";“连接已关闭”;运行摩卡测试时,但在应用程序中运行良好,node.js,async-await,mocha.js,node-mssql,Node.js,Async Await,Mocha.js,Node Mssql,我有一个node.js数据处理应用程序,可以从mssql中提取一些数据。它运行良好,并产生预期的结果。但是,集成测试不起作用,我希望它们能起作用 下面是连接管理和测试查询功能。我可以从调试器中的输出和运行中看出,在连接数据库之前,测试已经运行并失败。看起来我的Mocha异步设置不起作用,但它看起来像我在文档中看到的一切 节点-v v10.15.0 柴:“^4.2.0”, 摩卡咖啡:“^5.2.0” mssql:“^4.3.0” 这是我的摩卡咖啡测试,它失败了 const { expect } =

我有一个node.js数据处理应用程序,可以从mssql中提取一些数据。它运行良好,并产生预期的结果。但是,集成测试不起作用,我希望它们能起作用

下面是连接管理和测试查询功能。我可以从调试器中的输出和运行中看出,在连接数据库之前,测试已经运行并失败。看起来我的Mocha异步设置不起作用,但它看起来像我在文档中看到的一切

节点-v v10.15.0

柴:“^4.2.0”, 摩卡咖啡:“^5.2.0” mssql:“^4.3.0”

这是我的摩卡咖啡测试,它失败了

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()
        })
    })
无论我设置摩卡咖啡的超时时间有多长,它都会超时(我尝试了高达60秒)


我在这里束手无策,有人看到什么不对劲吗?

我想你的数据库连接出现了竞争情况

我在before()中这样做

然后在我的服务器(我使用的是节点)中,我在连接时发出:

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);
    });
});

希望这有帮助。我在这一个上拔出了一些头发。

我认为您的数据库连接存在竞争条件

我在before()中这样做

然后在我的服务器(我使用的是节点)中,我在连接时发出:

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
可以在连接实际完成之前返回。这样重写将确保
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=wait c3
感到困惑;您粘贴的代码中没有符号
c3

api。connect
可以在连接实际完成之前返回。这样重写将确保
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=wait c3
感到困惑;粘贴的代码中没有符号
c3

oops,将c3重命名为正确的名称。只是一个错误,当清理张贴。修正了我的问题,只做了一点小小的改动(从api.connect函数返回承诺:),效果不错。如果您不介意解释一下,为什么让api.connect async和waiting api.connect(config.sql)的行为不一样?因为您没有等待pool.connect的完成(而且您也不能,因为它是基于回调的函数,而不是基于承诺的)。我的答案或多或少只是一种样板方法,可以说明一个基于回调的函数。:)此外,我应该注意到,这可能是纯粹的运气,这已经在你的应用程序之前工作!嘿,你也修复了一个未来的bug!哈哈,谢谢你的帮助和解释…我怀疑应用程序的其余部分花了足够长的时间启动,在连接完成之前没有进行任何db调用OOPS,将c3重命名为正确的名称。只是一个错误,当清理张贴。修正了我的问题,只做了一点小小的改动(从api.connect函数返回承诺:),效果不错。如果您不介意解释一下,为什么让api.connect async和waiting api.connect(config.sql)的行为不一样?因为您没有等待pool.connect的完成(而且您也不能,因为它是基于回调的函数,而不是基于承诺的)。我的答案或多或少只是一种样板方法,可以说明一个基于回调的函数。:)此外,我应该注意到,这可能是纯粹的运气,这已经在你的应用程序之前工作!嘿,你也修复了一个未来的bug!哈哈,谢谢你的帮助和解释…我怀疑应用程序的其余部分花了足够长的时间启动,在连接完成之前没有进行db呼叫。谢谢你的回答。在我的情况下,它不是一个web应用程序,而是一个后台处理应用程序。我确实开始研究在before()中发出要处理的事件,但是@AKX的答案更清晰。谢谢你的回答。在我的情况下,它不是一个web应用程序,而是一个后台处理应用程序。我确实开始研究在before()中发出要处理的事件,但是@AKX的答案更清晰。