2016-06-30 1 views
1

Я новичок в koa.js, используя его с mongoose, и имею следующий сценарий: при запуске приложения я хочу загрузить json-файл и заполнить базу данных mongo содержимое json, если коллекция еще не существует с использованием мангуста. Я создал генераторную функцию loadMusicJSONIntoDB для обработки нагрузки и обернул эту функцию в co-блок с помощью app.listen, чтобы это произошло до начала работы сервера.koa.js mongoose check collection существует на сервере start

В нижеприведенном фрагменте я могу использовать listConnection мангуста после подключения к mongoose.connection.on ('open' ...), эта часть закомментирована. И я хочу проверить наличие коллекции Song, используя выход внутри loadMusicJSONIntoDB.

app.js:

var koa = require('koa'); 
var co = require('co'); 
var Song = require('./models/song'); 

var mongoose = require('mongoose'); 
// mongoose 
var connection = mongoose.connect('localhost/test'); 
... 
// Checking for collection exist like this works 
// mongoose.connection.on('open', function() { 
// mongoose.connection.db.listCollections({name: 'songs'}) 
//  .next(function(err, collinfo) { 
//   if (collinfo) { 
//   console.log("songs collection exists") 
//   } 
//  }); 
// }); 

function *loadMusicJSONIntoDB() { 
    console.log("loadMusicJSONIntoDB"); 
    var parsedMusicJSON = require('./music.json'); 
    //console.log(parsedMusicJSON); 
    try { 

    // QUESTION: I would like to do a yield to wait for the connection 
    // to be established? 

    // songs = yield mongoose.connection.db.listCollections({name: 'songs'}) 
    // .next(function(err, collinfo) { 
    //  if (collinfo) { 
    //   console.log(collinfo); 
    //   console.log("songs collection exists") 
    //  } 
    // }); 

    // Would like to do the following only if the songs collection does not exist 
    for (var key in parsedMusicJSON) { 
     if (parsedMusicJSON.hasOwnProperty(key)) { 
     console.log(key + " -> " + parsedMusicJSON[key]); 
     result = yield Song.findOne({name: key}); 
     //console.log(result); 
     if (!result) { // create record 
      var record = { name: key, tags: parsedMusicJSON[key]}; 
      console.log(record); 
      yield Song.create(record); 
     } 

     } 
    } 

    } catch (err) { 
    console.log(err); 

    } 

}; 

co(function*() { 
    yield loadMusicJSONIntoDB; 
    app.listen(3001, function() { console.log('listening on 3001') }); 
}).catch(function(err) { 
    console.error('Server boot failed:', err, err.stack); 
}); 

song.js

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 
var SongSchema = new Schema({ 
    name: String, 
    tags: [] 
}); 

module.exports = mongoose.model("Song", SongSchema); 

ответ

2

Вот что я в конечном итоге делает, получая соединение внутри блока совместно перед app.listen. но я не совсем понимаю, как мое решение может работать, особенно эта часть внутри app.js: songs = yield mongoose.connection.db.listCollections ({name: 'songs'}). next()

app.js

function *loadMusicJSONIntoDB() { 
    //console.log("loadMusicJSONIntoDB"); 
    var parsedMusicJSON = require('./music.json'); 
    //console.log(parsedMusicJSON); 
    try { 
    songs = yield mongoose.connection.db.listCollections({name: 'songs'}).next() 
    console.log(songs); 
    // if the song collection doesn't exist 
    if (!songs) 
    { 
     for (var key in parsedMusicJSON) { 
     if (parsedMusicJSON.hasOwnProperty(key)) { 
      console.log(key + " -> " + parsedMusicJSON[key]); 

      //result = yield Song.findOne({name: key}); 
      //console.log(result); 
      //if (!result) { // create record 
      var record = { name: key, tags: parsedMusicJSON[key]}; 
      console.log(record); 
      yield Song.create(record); 
      //} 

     } 
     } 
    } 

    } catch (err) { 
    console.log(err); 

    } 

}; 

co(function*() { 
    yield mongoose.connect('localhost/test'); 
    yield loadMusicJSONIntoDB; 
    app.listen(3001, function() { console.log('listening on 3001') }); 
}).catch(function(err) { 
    console.error('Server boot failed:', err, err.stack); 
}); 

на http://koajs.com/, мы имеем пример в цепочки вместе межплатформенное делать выход рядом, но в моем примере выше, если я следующий, не называя его(). т.е. песни = выход mongoose.connection.db.listCollections. ({Имя: 'песни'}) рядом Тогда я получаю [TypeError: Не удается прочитать свойство 'currentDoc' неопределенных]

С другой стороны, песни = yield mongoose.connection.db.listCollections ({name: 'songs'}). next() работает.

Вот документация, которую я нашел на mongodb, listCollections, но я все еще не уверен в следующем() поведении, читающем его. https://docs.mongodb.com/manual/reference/command/listCollections/

Смежные вопросы