process.nextTick和Mongoose回调

时间:2019-07-19 14:17:05

标签: node.js mongoose

它输出

db.close
You've successfully connect to mongo mongodb://localhost/foo
findOne
{ MongoError: Topology was destroyed

我希望db.close在猫鼬回调之后运行 。请说明节点如何精确运行Mongoose回调?

PS setTimeout起作用,但仅在> 100时起作用

/*
echo 'db.logos.insert({ 
  "name": "localhost", 
  "path": "path/to/logo", 
}); 
' | mongo foo
*/

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

const MONGODB_URI = process.env.MONGODB_URI || 'mongodb://localhost/foo';
mongoose.connect(MONGODB_URI, () => {
  // init
});
const db = mongoose.connection;
db.on('error', console.error.bind(console, 'connection error: '));
db.once('open', () => {
  // we're connected!
  console.log(`You've successfully connect to mongo ${MONGODB_URI}`);
});

const logoSchema = new mongoose.Schema({
  name: String,
  path: String,
});

const Logo = mongoose.model('Logo', logoSchema);

Logo.findOne({ name: 'localhost' }, (err, found) => { // logo name
  console.log('findOne');
  if (err) {
    console.log(err);
    // MongoError: Topology was destroyed
  } else if (found) {
    console.log(found);
  } else {
    console.log('not found');
  }
});

// this
/*
setTimeout(() => {
  console.log('db.close');
  db.close();
}, 100);
// or
*/
process.nextTick(() => {
  console.log('db.close');
  db.close();
});

/* // uncomment block

async function foo() {
  const logo = await Logo.findOne({ name: 'localhost' }).exec();
  console.log(logo);
  // db.close();  
}

//foo();

(async () => {
  try {
    await foo();
    db.close();  
  } catch (err) {
    // unhandled rejection
    console.log(err);
  }
})()
*/

0 个答案:

没有答案