Node.js Mongoose FindOne方法始终返回';空';
我正在尝试使用mongoose使我的express应用程序与MongoDb协同工作 以下是代码(编辑后): 我的问题是在我的收藏中找不到用户。我已经尝试指定一个集合名称,使用多字符串格式(大写或不大写),正如您所看到的,就像其他帖子对同一主题的回答一样 findOne()方法始终通过错误回调,即使文档已正确添加到集合中 如果你们中有人有想法或什么的话 非常感谢 编辑: 根据你的建议,我更新了一些更符合逻辑的代码 在我的MongoLabNode.js Mongoose FindOne方法始终返回';空';,node.js,mongodb,express,mongoose,Node.js,Mongodb,Express,Mongoose,我正在尝试使用mongoose使我的express应用程序与MongoDb协同工作 以下是代码(编辑后): 我的问题是在我的收藏中找不到用户。我已经尝试指定一个集合名称,使用多字符串格式(大写或不大写),正如您所看到的,就像其他帖子对同一主题的回答一样 findOne()方法始终通过错误回调,即使文档已正确添加到集合中 如果你们中有人有想法或什么的话 非常感谢 编辑: 根据你的建议,我更新了一些更符合逻辑的代码 在我的MongoLabUsers收藏中,我有一个这样的文档: { "_id"
Users
收藏中,我有一个这样的文档:
{
"_id": {
"$oid": "5641e9a1e4b0af6681f0bef1"
},
"username": "admin",
"password": "admin"
}
在POST
数据之后,“admin”与用户名完全相同,mongoose查询返回以下内容:
web.1 | admin // req.body.username
web.1 | Error: null null // findOne() error callback
mongoDB操作仅在
/routes/admin.js
中进行,而moongose.connection
仅在/index.js
中进行。我对模块概念不太熟悉…要运行查询,必须先创建一个模型:var schema = new mongoose.Schema({
username: String,
password: String});
var Users = mongoose.model('Users-CollectionName', schema);
然后根据需要查询数据库。
Users.findOne({
username: req.body.username
}, function(err, user) {
console.log('Error: ' + err, user);
});
要运行查询,您必须首先创建一个模型:
var schema = new mongoose.Schema({
username: String,
password: String});
var Users = mongoose.model('Users-CollectionName', schema);
然后根据需要查询数据库。
Users.findOne({
username: req.body.username
}, function(err, user) {
console.log('Error: ' + err, user);
});
User.find()为您提供了什么(返回所有保存的文档)?您似乎在每次调用应用程序时都添加了用户。这使我认为您的案例实际上是一个失败的测试,而不是一个失败的应用程序。nodejs中的代码是“异步”的,虽然您似乎理解了其中的部分概念,但您似乎没有意识到
.save()
操作不一定在路由可用之前被调用,并且可能在“测试”中被调用。因此,没有数据。您需要确保数据在要求召回之前已保存。而且您不应该在“POST”请求中检索数据,因为它是用于添加的。您不需要指定mongo集合的名称:mongoose。model(“User”,UserSchema)
将自动创建一个名为users
@Blakes Seven的集合,谢谢您的解释!我想知道,即使应用程序每次添加一个用户文档,在5次或6次之后,findOne()是否应该返回一些内容,不是吗?因为集合中存在用户名为“John”的文档。我的主要观点是,除了这里列出的代码之外,显然还有其他一些交互(例如自动测试用例),这可以解释为什么调用POST方法看不到任何数据。在相同的情况下,每次运行时数据似乎都被其他内容删除。因此,这里基本上还有其他代码,您没有告诉我们,这就解释了问题。User.find()为您提供了什么(返回所有保存的文档)?您似乎在每次调用应用程序时都添加了用户。这使我认为您的案例实际上是一个失败的测试,而不是一个失败的应用程序。nodejs中的代码是“异步”的,虽然您似乎理解了其中的部分概念,但您似乎没有意识到.save()
操作不一定在路由可用之前被调用,并且可能在“测试”中被调用。因此,没有数据。您需要确保数据在要求召回之前已保存。而且您不应该在“POST”请求中检索数据,因为它是用于添加的。您不需要指定mongo集合的名称:mongoose。model(“User”,UserSchema)
将自动创建一个名为users
@Blakes Seven的集合,谢谢您的解释!我想知道,即使应用程序每次添加一个用户文档,在5次或6次之后,findOne()是否应该返回一些内容,不是吗?因为集合中存在用户名为“John”的文档。我的主要观点是,除了这里列出的代码之外,显然还有其他一些交互(例如自动测试用例),这可以解释为什么调用POST方法看不到任何数据。在相同的情况下,每次运行时数据似乎都被其他内容删除。所以这里基本上还有其他代码在工作,你没有告诉我们,这就解释了这个问题。