我正在学习与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
可能有问题,也许我应该使用像update
或create
这样的东西,但是我已经看到的每个教程和文档都说{{1} }}
当我删除该字段并且该集合为空并然后发送POST时,它会立即保存,然后忽略所有其他POST(第二个,第三个等)。
我做错了什么?我希望我的收藏中有超过1个用户:(
[编辑]
看起来正在创建我的ID"在飞行中"所以MongoDB应根据文档触发save
:https://docs.mongodb.com/manual/reference/method/db.collection.save/#behavior(我也不确定它现在正在做什么,因为它看起来不像{{1}或者:/)
答案 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" } )
索引。我曾经有过。不得不放弃收藏,然后神奇地开始工作!