使用nodejs和mongodb获取登录userId

时间:2016-04-04 06:28:11

标签: node.js mongodb

我正在尝试使用下面的代码登录userId,但它始终仅显示索引为0(零)位置的userId

api.js

var insertDocument = function(db, callback) {
db.collection('users').findOne(function (err, user) {
    if (err) return callback(err);

    var record = {
        "Product_Name": json.Product_Name,
        "Brand": json.Brand,
        "Color": json.Color,
        "Image": json.Image,
        "Price": json.Price,
        "Rating": json.Rating,
        "Description": json.Description,
        "Category": json.Category,
        "Url": urla,
        "userId":user._id,
    }

    db.collection('proInfo').insertOne( record, function(err, result) {
        assert.equal(err, null);
        console.log("Inserted a document into the proInfo collection.");
        callback(result);
    });
});
};

在上面的代码中,我从userId集合中获取users并将信息插入proInfo集合,插入时始终插入第一个用户的userId即用户出现在索引0的位置。但是我想要登录人员的userId。如何解决这个问题,请帮助我。

2 个答案:

答案 0 :(得分:0)

它会那样做。这是因为您没有向findOne函数提供查询文档。此外,我不认为有必要从users集合中找到用户,因为您只是使用了用户的_id字段。所以你可以这样做:

var insertDocument = function(db, callback) {
var record = {
        "Product_Name": json.Product_Name,
        "Brand": json.Brand,
        "Color": json.Color,
        "Image": json.Image,
        "Price": json.Price,
        "Rating": json.Rating,
        "Description": json.Description,
        "Category": json.Category,
        "Url": urla,
        "userId":userIdYouGetFromRequest,
    };

db.collection('proInfo').insertOne( record, function(err, result) {
    assert.equal(err, null);
    console.log("Inserted a document into the proInfo collection.");
    callback(result);
});    };

如果您希望在proInfo集合中插入其他用户相关字段,请使用查询文档编辑对findOne方法的调用。像这样:

var insertDocument = function(db, callback) {
db.collection('users').findOne({_id: userIdYouGetFromRequest}, function (err, user) {
    if (err) return callback(err);

    var record = {
        "Product_Name": json.Product_Name,
        "Brand": json.Brand,
        "Color": json.Color,
        "Image": json.Image,
        "Price": json.Price,
        "Rating": json.Rating,
        "Description": json.Description,
        "Category": json.Category,
        "Url": urla,
        "userId":user._id,
    };

    db.collection('proInfo').insertOne( record, function(err, result) {
        assert.equal(err, null);
        console.log("Inserted a document into the proInfo collection.");
        callback(result);
    });
});    
};

注意userIdYouGetFromRequest是您必须从前端传递到请求正文中的内容。

答案 1 :(得分:0)

通常,findOne()函数接受query object,用于识别集合中的文档。由于您未提供任何query object来标识文档,因此findOne会返回它在集合中找到的第一个文档。阅读MongoDB文档:https://docs.mongodb.org/manual/reference/method/db.collection.findOne/#definition

注意:请避免使用回调在NodeJS中编程,并在ES6中使用Promises功能支持。它将简化异步编码并防止callback hell达到最大值。

如果我是你,我会将你的代码修改为:

var insertDocument = function (db, callback) {
  var queryObj = {
    "userId": user._id
  };

  return db.collection('users').findOne(queryObj)
    .then(function (user) {
      //If the find query was successful, this function will be
      //called with the document returned.
      var record = {
        "Product_Name": json.Product_Name,
        "Brand": json.Brand,
        "Color": json.Color,
        "Image": json.Image,
        "Price": json.Price,
        "Rating": json.Rating,
        "Description": json.Description,
        "Category": json.Category,
        "Url": urla,
        "userId": user._id
      };

      return db.collection('proInfo').insertOne(record)
        .then(function (result) {
          console.log("Inserted a document into the proInfo collection.");
          return result;
        },
        //Handle error for second DB call.
        //If db call to insert doc fails, promise will be rejected
        function(err){
          assert.equal(err, null);
        }
      );
    },
    //Handle error for first DB call.
    //If db call to find users fails, promise will be rejected
    function(err){
      return Promise.reject(err);
    });
};

在尝试此代码之前,请先了解Promise。它的功能已在社区中得到广泛采用。