NodeJS / MongoDB - 字段只添加一次?

时间:2017-04-29 00:01:12

标签: node.js mongodb reactjs

我正在学习与Node(Express / Mongoose)和MongoDB的反应,现在一切似乎都按预期工作但我有这个大问题:

var userSchema = new mongoose.Schema({
  login: { type: String, required: true, unique: true },
  password: { type: String, required: true }
})

app.post('/registerUser', function (req, res) {
  res.send(req.body)

  db.on('error', console.error.bind(console, 'connection error:'))

  // save user using model
  var user = new UserModel(req.body)
  user.save()
}

每次我发布登录名和密码时,它只保存一次,然后结束。

例如,如果我发送三次POST:

login=admin&password=admin

login=admin2&password=admin2

login=admin3&password=admin3

db.users.count()只显示1,只有第一个POST (admin:admin)在数据库中。其余的被忽略了。我正在运行console.logs以查看错误但每个POST都有不同的_id,但不知何故在第一个之后不保存。我想也许save可能有问题,也许我应该使用像updatecreate这样的东西,但是我已经看到的每个教程和文档都说{{1} }}

当我删除该字段并且该集合为空并然后发送POST时,它会立即保存,然后忽略所有其他POST(第二个,第三个等)。

我做错了什么?我希望我的收藏中有超过1个用户:(

[编辑]

看起来正在创建我的ID"在飞行中"所以MongoDB应根据文档触发savehttps://docs.mongodb.com/manual/reference/method/db.collection.save/#behavior(我也不确定它现在正在做什么,因为它看起来不像{{1}或者:/)

2 个答案:

答案 0 :(得分:1)

您的问题是您的集合具有阻止创建的唯一索引,因此只需删除该索引:

db.users.dropIndex('index name here');

额外建议:

1)db.on('error'不会捕获数据库操作错误。

2)总是尝试创建记录,然后回复。 在用户体验的情况下,如果帐户创建成功与否,则必须通知用户。

简而言之 - 检查一下:

db.on('error', console.error.bind(console, 'connection error:'))

app.post('/registerUser', (req, res) => {
  // 1. check if user account exist
  const
    query = {
      login: req.body.login
    };
  UserModel
    .findOne(query)
    .exec((error, user) => {
      if(error) {
        console.error('ERROR:', error);
        res.status(500).send({
          type: 'system',
          message: 'Cannot create user record',
          trace: error
        });
        return;
      }

      if(user) {
        res.status(405).send({
          type: 'not-allowed',
          message: 'User record already exists'
        });
        return;
      }

      // 2. create record if user account record does not exist
      UserModel.create(req.body, (error, user) => {
        if(error) {
          console.error('ERROR:', error);
          res.status(500).send({
            type: 'system',
            message: 'Cannot create user record',
            trace: error
          });
          return;
        }
        res.send(user);
     });
  });
});

答案 1 :(得分:1)

好的,我完全忘记了我可以使用mongo的CLI调试它,问题很容易从那里发现。如果发生这种情况,请尝试以下步骤:

启动 mongo 表单命令行/终端。

尝试为您复制有问题的操作节点/ mongoose句柄,在我的情况下,它是在添加新用户:

package SqlCreator; use warnings; use strict; sub new { my ($class, %args) = @_; return bless \%args, $class; } sub editArray { my (@array) = @_; my $text = ''; my $arraySize = scalar @array; for(my $i = 1; $i<$arraySize; $i++) { $text .= "'" . $array[$i] . "'". ","; } my $length = length $text; $text = substr($text, 0, $length-1); return $text; } sub createInsertColumn { my (@column ) = @_; my $sql = ''; $sql .= ' ('; $sql .= editArray(@column); $sql .= ')'; return $sql; } sub createInsertValue{ my (@value) = @_; my $sql = ''; $sql .= ' VALUES ('; $sql .= editArray(@value); $sql .= ')'; return $sql; } sub createInsertSql{ my ($table, @column, @value) = @_; my $sql = 'INSERT INTO ' . $table; $sql .= createInsertColumn(@column); $sql .= createInsertValue(@value); return $sql; } 1; use warnings; use strict; use SqlCreator; my $object = SqlCreator->new; my @column = ('name', 'gender', 'age'); my @value = ('Mehmed Fatih Temiz', 'male', 28); my $sql = $object->createInsertSql('person', @column, @value); print $sql;

阅读错误消息,在我的情况下是:

<a href="index.html?hi=0">

我没有use users db.users.save( { login: "fromCLI", password: "fromCLI" } ) db.users.save( { login: "fromCLI2", password: "fromCLI2" } ) 索引。我曾经有过。不得不放弃收藏,然后神奇地开始工作!