1

我只是为使用 MongoDB、Backbone 和 Node with Express 创建一个简单的用户登录。

我一直在查询数据库以获取用户凭据并可靠地识别它们是否存在。

我在这里尝试两件事:

// 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 shell。

我的问题是,如何从我的 Node.js 应用程序中访问这些方法?

我尝试的第二种方法:

// 当用户发帖到 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;s。我尝试使用 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

如果您使用的是Native Node.JS MongoDB 驱动程序,则有一个collection.findOne()方法,并且游标确实具有nextObject()each()shell 方法hasNext()forEach(). mongo shell 等效项的实现/命名在驱动程序之间可能略有不同,但您应该能够将 mongo shell 示例转换为 Node.JS。

至于保存新用户 .. 而不是在插入之前查询用户,您最好在字段上添加唯一索引email并使用. 如果由于重复电子邮件而导致插入失败,您可以处理结果。如果您在插入之前进行查询,则存在潜在的竞争条件,即在您检查电子邮件时电子邮件可能不存在,但在您执行插入时确实存在。safe:trueerr

于 2012-07-09T05:50:31.973 回答