【问题标题】:Mongoose FindOne method always returning 'null'Mongoose FindOne 方法总是返回“null”
【发布时间】:2016-02-10 17:50:02
【问题描述】:

我正在尝试使用 mongoose 让我的 express 应用程序与 MongoDb 一起使用。

这里是代码(编辑之后):

var express = require('express');
var router = express.Router();
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;
var mongoose = require('mongoose');
var Schema = mongoose.Schema;
var UserSchema = new Schema({
    username: String,
    password: String
});
var Users = mongoose.model('Users', UserSchema);
/* GET admin page. */
router.get('/', function(req, res, next) {
    res.render('admin/admin', {
        title: 'Admin'
    });
});

router.post('/login', function(req, res, next) {
    console.log(req.body.username);
    Users.findOne({
        username: req.body.username
    }, function(err, user) {
        console.log('Error: ' + err, user);
    });
    // console.log(req.body.username, req.body.password);
    // passport.authenticate('local', {
    //     successRedirect: '/',
    //     failureRedirect: '/admin'
    // });
});
module.exports = router;

我的问题是在我的收藏中找不到用户。我已经尝试指定一个集合名称,具有多种字符串格式(是否大写),正如您所看到的,并且就像其他帖子在同一主题上的回答一样。

findOne() 方法总是通过错误回调,即使文档被正确添加到集合中。

如果你们中的某个人有想法或某事!

非常感谢!

编辑:

根据您的建议,我更新了代码以获得更合乎逻辑的内容。

在我的 MongoLab Users 收藏中,我有一个这样的文档:

{
    "_id": {
        "$oid": "5641e9a1e4b0af6681f0bef1"
    },
    "username": "admin",
    "password": "admin"
}

POST 数据之后,“admin”与用户名完全相同,猫鼬查询返回:

web.1  | admin                // req.body.username
web.1  | Error: null null     // findOne() error callback 

mongoDB 操作仅发生在 ./routes/admin.js 中,而 moongose.connection 仅发生在 ./index.js 中。我对模块概念不太满意...

【问题讨论】:

  • User.find() 给你什么(返回所有保存的文档)?
  • 您似乎在每次调用应用程序时都添加了用户。这让我觉得你的案例实际上是一个失败的测试,而不是一个失败的应用程序。 nodejs 中的代码是“异步”的,尽管您似乎了解了这个概念,但您似乎没有意识到 .save() 操作不一定在路由可用之前被调用,并且很可能在“测试”。因此,没有数据。您需要确保在您要求召回数据之前“保存数据”。无论如何,您都不应该在“POST”请求中检索数据,因为它是为了添加。
  • 你不需要指定mongo集合的名称:mongoose.model("User", UserSchema)会自动创建一个名为users的集合。
  • @Blakes 七感谢您的解释!我想知道即使应用程序每次都添加一个用户文档,在 5 或 6 次之后,findOne() 应该给我一些回报,不是吗?因为集合中存在用户名:“John”的文档。
  • 我的主要观点是,除了此处列出的代码之外,显然还有其他一些交互发生(例如自动化测试用例),这可以解释为什么调用 POST 方法没有看到任何数据。在同样的情况下,似乎每次运行时数据都被其他东西删除了。所以这里基本上还有其他代码在起作用,你没有告诉我们,这解释了这个问题。

标签: node.js mongodb express mongoose


【解决方案1】:

为了能够运行查询,您必须先创建一个模型:

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

【讨论】:

    猜你喜欢
    • 2015-04-30
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    • 2019-03-25
    • 2020-08-16
    • 1970-01-01
    • 2016-07-10
    • 1970-01-01
    相关资源
    最近更新 更多