2017-01-11 1 views
0

Я пытаюсь создать очень простой форум, используя nodejs, mongo и mongoose.mongoose document.save не работает

До сих пор я создал мангуст схему для пользователей:

var mongoose = require('mongoose'); 

var user = { 
    _id: { type: String, required: true }, 
    password: { type: String, required: true } 
}; 

var schema = new mongoose.Schema(user); 

module.exports = schema; 
module.exports.user = user; 

Затем создал модель:

var mongoose = require('mongoose'); 

var url = 'mongodb://localhost:27017/forum' 

mongoose.connect(url); 

mongoose.connection.on('connected', function() { 
    console.log('Stablished connection on ' + url); 
}); 
mongoose.connection.on('error', function(error) { 
    console.log('Something wrong happened: ' + error); 
}); 
mongoose.connection.on('disconnected', function() { 
    console.log('connection closed'); 
}); 

var User = mongoose.model('User', require('./user')); 

module.exports.User = User; 

Наконец, есть файл, который содержит все модели (в настоящее время только один) и его методы:

var models = require('./models'); 

var User = models.User 

exports.addUser = function(user, password) { 
    var data = new User({ _id: user, password: password }); 
    data.save(function(error) { 
     console.log('inside'); 
     if(error) { console.log('ERROR: ' + error); return true; } 
     else { console.log('User ' + user + ' added'); return false; } 
    }); 
}; 

exports.getUserList = function() { 
    User.find().lean().exec(function(error, users) { 
     if(error) { console.log('ERROR: ' + error); } 
     else { return JSON.stringify(users); } 
    }); 
} 

проблема возникает, когда я выполняю этот файл:

var mongodb = require('mongodb'); 
var mongoose = require('mongoose'); 

var dm = require('./dm'); 

var users = { 'user1': '1234', 
       'user2': '1234', 
       'user3': '1234', 
       'user4': '1234' 
      }; 

console.log('Initial user list'); 
dm.getUserList(); 
for(var user in users) { 
    dm.addUser(user, users[user]); 
} 
console.log('Final user list'); 
dm.getUserList(); 
process.exit(0); 

Кажется, что он ничего не делает и не сохраняет пользователей. Выход:

Initial user list 
Final user list 

Спасибо!

+2

Ваш код принимает все будет работать в синхронный способ. Вам нужно либо создать функции 'addUser()' и 'getUserList', чтобы иметь обратные вызовы, либо использовать' Promises' для этого. – chridam

+0

Добавлены обратные вызовы, но все еще не работают. Дело в том, что кажется, что он не входит в функцию .save/.find. Например, если я установил обратный вызов User.find на console.log, он ничего не подскажет – Dexter

ответ

0

Удалите часть process.exit() или заверните ее в таймаут. Вы не даете своей базе данных достаточно времени для выполнения. Например. поставить это в конце вместо того, чтобы:

... 
setTimeout(() => process.exit(0), 2000); 

Редактировать: или добавить обещания, как кто-то заметил:

exports.addUser = function(user, password) { 
    var data = new User({ _id: user, password: password }); 
    return data.save() 
    .then(() => console.log('User ' + user + ' added')) 
    .catch(function(error) { 
    console.log('ERROR: ' + error); 
    else { return false; } 
}); 
}; 

Затем в главном цикле:

const promises = users.map(userData => addUser(userData)); 
Promise.all(promises) 
.then(() => { 
    console.log('All users added.'); 
    // .. do another async operation here, or process.exit(); 
}); 
+1

Благодарим вас за настройку этого setTimeout. Наконец, добавление setTimeout и использование обратных вызовов отлично работает – Dexter

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

  • Нет связанных вопросов^_^