2015-08-13 4 views
0
var connection_string = 'localdb'; //local db by default 

var mongojs = require('mongojs'); 
var collections = ['projects', 'homeAnimationData']; 
var db = mongojs(connection_string, collections); 

db.homeAnimationData.save({image: '/imagea', width: '200px'}, function(err, saved) { 
    if(err || !saved) console.log('not saved'); 
    else console.log('Saved'); 
});  

db.homeAnimationData.find({}).limit(10).forEach(function(err, doc) { 
    if (err) throw err; 
    if (doc) { 
     console.dir(doc); 
    } 
}); 

Ни одна из консолей не работает в приложении nodejs, и я не получаю никаких ошибок?mongojs не выполняет операции CRUD

ответ

0

Я полагаю, что вы на самом деле звоните db.close(), но не сообщая нам об этом в своем вопросе. Это и случай отсутствия вывода, когда вы переходите к .find(), - это, прежде всего, проблема того, что методы здесь «асинхронны», и вам нужно «подождать» для выполнения обратного вызова, которое вы хотите.

Также здесь следует использовать метод .forEach() «экономно», так как это почти не то, что вы действительно хотите в производственном коде. Вот то же самое, что хорошо работает с небольшим количеством управления асинхронным потока помощью из "async" библиотеки:

var localdb = 'localdb', 
    async = require('async'), 
    mongojs = require('mongojs'), 
    collections = ['projects','homeAnimationData'], 
    db = mongojs(localdb,collections); 


async.series(
    [ 
    function(callback) { 
     db.homeAnimationData.remove({},callback); 
    }, 
    function(callback) { 
     var data = { "image": "/imagea", "width": "200px" }; 
     db.homeAnimationData.save(data,function(err,saved) { 
     if (err) callback(err); 
     console.log('Saved'); 
     callback(); 
     }); 
    }, 
    function(callback) { 
     db.homeAnimationData.find({}).limit(10).toArray(function(err,docs) { 
     if (err) callback(err); 
     console.dir(docs); 
     callback(); 
     }); 
    } 
    ], 
    function(err) { 
    if (err) throw err; 
    db.close(); 
    } 
); 

Или поочередно вызывая метод .toArray(), вы можете использовать интерфейс "stream", который изначально при условии:

var localdb = 'localdb', 
    async = require('async'), 
    mongojs = require('mongojs'), 
    collections = ['projects','homeAnimationData'], 
    db = mongojs(localdb,collections); 


async.series(
    [ 
    function(callback) { 
     db.homeAnimationData.remove({},callback); 
    }, 
    function(callback) { 
     var data = { "image": "/imagea", "width": "200px" }; 
     db.homeAnimationData.save(data,function(err,saved) { 
     if (err) callback(err); 
     console.log('Saved'); 
     callback(); 
     }); 
    }, 
    function(callback) { 
     var cursor = db.homeAnimationData.find({}).limit(10); 

     cursor.on('data',function(data) { 
     cursor.pause(); 
     console.dir(data); 
     cursor.resume(); 
     }); 

     cursor.on('err',callback); 

     cursor.on('end',callback); 
    } 
    ], 
    function(err) { 
    if (err) throw err; 
    db.close(); 
    } 
); 

В последнем случае это дает вам намного лучшую обработку для больших результатов. Сама документация mongojs предоставляет и example из .pipe() для JSONStream.

Но все работает отлично, вам просто нужно помнить, что это «асинхронное» программирование и логично дождаться завершения выполнения, прежде чем переходить к некоторым, например, «считывать» записанные данные или действительно закрывать соединение с базой данных.

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