【问题标题】:mongoose document.save not working猫鼬document.save不工作
【发布时间】:2017-05-26 05:03:55
【问题描述】:

我正在尝试使用 nodejs、mongo 和 mongoose 创建一个非常简单的论坛。

到目前为止,我为用户创建了一个 mongoose Schema:

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

谢谢!

【问题讨论】:

  • 您的代码假定一切都将以同步方式运行。您需要创建函数 addUser()getUserList 以进行回调或使用 Promises 使其工作。
  • 添加了回调,但仍然无法正常工作。问题是它似乎没有进入 .save/.find 功能。例如,如果我将 User.find 回调设置为 console.log 它不会提示任何内容

标签: node.js mongodb mongoose


【解决方案1】:

删除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();
});

【讨论】:

  • 感谢您指出 setTimeout。最后添加 setTimeout 并使用回调工作正常
猜你喜欢
  • 2018-07-22
  • 2018-05-02
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-14
  • 2013-11-01
  • 2021-02-10
相关资源
最近更新 更多