ExpressでMongoDB、Backbone、およびNodeを使用するための単純なユーザーログインを作成しています。
ユーザー資格情報についてデータベースにクエリを実行し、それらが存在するかどうかを確実に特定することに固執しています。
私はここで2つのことを試みています:
// When user posts to the url
app.post('/save/user', function (req, res) {
// create user object and store email from form
var user = {
email : req.body.email
};
// in my collection users
db.collection('users', function (err, collection) {
// create a variable existence with the value, in lamens terms 'yes it does' or 'no it doesnt'
var existence = findOne(collection, {
$query : {email : user.email}
});
});
};
// findOne function passing the collection and the query object
function findOne(coll, query) {
var cursor = coll.find(query).limit(1);
return cursor.hasNext() ? cursor.next() : null;
}
だから、これは私が試した最初の方法です。問題は、カーソルに「next()、hasNext()、findOne()、forEach()」などの javascript 環境用のメソッドがないのに、mongo シェル用のメソッドしかない理由がわかりません。
私の質問は、Node.js アプリからこれらのメソッドにアクセスするにはどうすればよいですか?
私が試した2番目の方法:
// ユーザーが URL に投稿したとき app.post('/save/user', function (req, res) {
// create user object and store email from form
var user = {
email : req.body.email
};
// in my collection users
db.collection('users', function (err, collection) {
// Have a look for the email entered
var query = collection.find({
$query : {email : user.email}
}).limit(1);
// If it's true, then send response
query.each( function (err, item) {
// If the item does exists, then send back message and don't insert. Otherwise, insert.
if(item !== null) {
console.log('Item does not equal null : ', item);
res.send('The email : ' + item.email + ' already exists');
} else {
console.log('Item does equal null : ', item);
collection.insert(user);
res.send('New user with email : ' + user.email + ' was saved');
}
});
});
};
これに関する問題は、ある時点で常に null を返すため、ユーザーに「既に存在します」と警告し、次回は null になるため、電子メールを保存することです。
私はポイントを逃していると思うので、正しい方向へのポイントは素晴らしいでしょう.
よろしくお願いします!
さて、私は解決策を調べましたが、まだ要点を逃しているに違いありません。
ユーザー オブジェクトを safe : true で渡して挿入を行っていますが、複数のユーザー オブジェクトを入力できますが、同一の ID しか探していません。new ObjectID() で ID を作成しようとしましたが、ユーザーがメール アドレスを入力してから同じメールで新しいユーザーを作成しようとすると、そのエントリの新しい ID が作成されるかどうかはまだわかりません。
findOne を実行することで、存在するかどうかを簡単に確認できます。insert でどのように実行できるかわかりません。
app.post('/register/user', function (req, res) {
// Store user details in object
var user = {
username : req.body.user,
email : req.body.email,
password : req.body.password
};
db.collection('users', function (err, collection) {
collection.insert(user, {safe : true}, function (err, doc) {
console.log('what is doc : ', doc);
if(!err) {
res.writeHead(200, {
"Content-Type" : "text/plain",
"Message" : "New user added",
"Access-Control-Allow-Origin" : "*"
});
} else {
console.log('Error is : ', err);
res.writeHead(200, {
"Content-Type" : "text/plain",
"Message" : "User already exists",
"Access-Control-Allow-Origin" : "*"
});
}
res.end();
});
});
});