我正在尝试使用下面的代码登录userId
,但它始终仅显示索引为0(零)位置的userId
。
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
。如何解决这个问题,请帮助我。
答案 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。它的功能已在社区中得到广泛采用。