简体   繁体   中英

Callback in “once('open')” doesn't fire in mongoose

Well I have make at least 50 attempts and I didn't find the solution, please help me!. When I am making the connection to my database through mongoose I don't achieve that the callback fire when I make my tests with mocha. I don't know what more to do. Here is my code

db.test

'use strict'

const mocha = require('mocha')
const assert = require('chai').assert
const LisaClient = require('mongoose')
const Db = require('../')
require('babel-polyfill')
const fixtures = require('./fixtures')

describe('create database structure', function () {
  let dbName
  let db

  before(function (done) {
    dbName = `pos_lisa`
    db = new Db({ db: dbName })

    let urlConnection = `mongodb://localhost:27017/${dbName}`
    LisaClient.connect(urlConnection, function (err) {
      if (err) return console.log(err)
      done()
    })
  })

  it('create user', async function () {
    let userModel = fixtures.getUser()

    let result = await db.saveUser(dbName, userModel)
    assert.typeOf(db.saveUser, 'function', 'saveUser is a function')
  })

  after(function (done) {
    LisaClient.disconnect()
    done()
  })
})

and here is the lines where the callback doesn't fire (db.js)

saveUser (dbName, userModel) {
  console.log(LisaClient.connection.readyState)
  if (LisaClient.connection.readyState !== 1) {
    console.log('not connected')
  } else {
    LisaClient.connection.once('open', function () {
      // this never fire
      console.log('connected')
    })
  }   
}

In advance thanks A LOT for your help

Ok, so the root of your problem is that you're binding to the 'once' event long after the event has happened.

Put another way, because the 'create user' test happens AFTER the connection has been successfully made (you call done in the callback of the setup), you miss the 'once' event.

I would put the 'once' event in the 'before' function. Then only iterate through your tests after that has passed.

A simplified example would be something like:

test.js

'use strict'

const LisaClient = require('mongoose');
const Db = require('../')
const fixtures = require('./fixtures')
let dbName
let db    

describe('create database structure', function () {
  before(function (done) {
    dbName = `pos_lisa`
    db = new Db({ db: dbName })
    const urlConnection = 'db_connection_string_here'
    LisaClient.connect(urlConnection);
    LisaClient.connection.once('open', function () {
      console.log('connected')
      done();
    })
  })

  it('create user', function (done) {
    let userModel = fixtures.getUser()
    if (LisaClient.connection.readyState !== 1) {
      console.log('not connected');
    } else {
      db.saveUser(dbName, userModel)
    }
  });

})

db.js

saveUser (dbName, userModel) {
    if (LisaClient.connection.readyState !== 1) {
      console.log('not connected');
    } else {
      var Kitten = LisaClient.model('Kitten', LisaClient.Schema({name: String}));
      var kitten = new Kitten({name: 'Sprinkles'});
      kitten.save(function(err, result){
        //assert(!err)
        //assert(result);
        console.log(result);
        done();
      })
    }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM