1

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();

  });

});

});

4

1 に答える 1

3

ネイティブの Node.JS MongoDB ドライバーを使用している場合、collection.findOne()メソッドがあり、カーソルには、シェル メソッドと同等のメソッドnextObject()とメソッドがあります。同等の mongo シェルの実装/命名はドライバーによって若干異なる場合がありますが、mongo シェルの例を Node.JS に変換できるはずです。each()hasNext()forEach()

新しいユーザーを保存する限り..挿入する前にユーザーを照会するのではなく、emailフィールドに一意のインデックスを追加し、コレクションに挿入することをお勧めしsafe:trueます。errメールの重複が原因で挿入が失敗した場合は、結果を処理できます。挿入する前にクエリを実行すると、電子メールを確認したときに存在しない可能性があるが、挿入を実行するまでに存在する可能性のある競合状態が発生する可能性があります。

于 2012-07-09T05:50:31.973 に答える