【问题标题】:Mongoose findById is returning null猫鼬 findById 返回 null
【发布时间】:2015-12-17 03:04:59
【问题描述】:

所以我有这个架构:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var TreeSchema = new Schema({
}, { collection: 'treeLocations' });

var TreeDetailsSchema = new Schema({
}, { collection: 'treeInfo' });

module.exports = mongoose.model('Tree', TreeSchema);
module.exports = mongoose.model('TreeDetail', TreeDetailsSchema, "treeInfo");

我是这样通过 ID 调用的:

var TreeDetails = require('./app/models/tree').model('TreeDetail');
router.route('/api/trees/:tree_id')
    .get(function(req, res) {
        TreeDetails.findById(req.params.tree_id, function(err, treedetail) {
            if (err)
                res.send(err);
            res.json(treedetail);
        });
    });

出于某种原因 - http://localhost:3000/api/trees/5498517ab68ca1ede0612d0a 这是一棵真正的树,正在返回 null

可能对你有帮助的事情:

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我没有看到的步骤是您如何实际连接到 MongoDB,然后是如何从连接中获取模型。

    //  connect to MongoDB
    var db = mongoose.createConnection('mongodb://user:pass@host:port/database');
    
    //  now obtain the model through db, which is the MongoDB connection
    TreeDetails = db.model('TreeDetails');
    

    最后一步是如何将模型与连接的 mongo 数据库相关联。

    更多信息Mongoose.model

    有几种方法可以与mongoose建立与MongoDB的连接,教程使用: mongoose.connect('mongodb://node:node@novus.modulusmongo.net:27017/Iganiq8o');

    (我个人更喜欢更明确的mongoose.createConnection,如示例所示)

    (我在这个例子中使用了猫鼬4.3.1


    我的重现步骤,以提供一个工作示例(不为其创建网络服务):

    var mongoose = require('mongoose'),
        TreeDetails, db;
    
    //  create the model schema
    mongoose.model('TreeDetails', mongoose.Schema({
        //  ..  your field definitions
    }, {collection: 'treeInfo'}));
    
    db = mongoose.createConnection('mongodb://user:pass@host/example');
    TreeDetails = db.model('TreeDetails');
    
    TreeDetails.findById('5671ac9217fb1730bb69e8bd', function(error, document) {
        if (error) {
            throw new Error(error);
        }
    
        console.log(document);
    });
    

    【讨论】:

    • 谢谢-澄清-这不是(在我的代码中)您说我缺少的步骤是什么吗? module.exports = mongoose.model('TreeDetail', TreeDetailsS​​chema, "treeInfo"); var TreeDetails = require('./app/models/tree').model('TreeDetail');
    • module.exports = mongoose.model(...) 部分将您的模型注册到猫鼬,它实际上并没有连接到数据库。我已经更新了答案以进一步阐明联系
    • 嘿@Rogier - 感谢您的帮助,但它仍然为空。
    • 如果您将代码放在我的答案中的行下方(确保仔细检查 id)在单独的文件中(例如test.js)并运行它(node test.js)怎么办?因为这对我来说很好。如果确实有效,您可以尝试评论 module.exports = mongoose.model('Tree', TreeSchema); 行,不确定是否有帮助,但在一个文件中包含多个 module.exports = ... 似乎很奇怪
    【解决方案2】:

    代替:

    var TreeDetails = require('./app/models/tree').model('TreeDetail');
    

    尝试:

    var mongoose = require('mongoose'),
        TreeDetails = mongoose.model('TreeDetail');
    

    定义集合名称应该不会给您带来任何问题。这正是使用 mongo shell 时在数据库中调用集合的内容。

    为了确定,在调用 findById 之前尝试记录 req.params.tree_id 以确保它如您所怀疑的那样通过。

    【讨论】:

    • 嘿,谢谢 - 刚刚试过 - 这似乎不是问题。 tree_id 也很好。它是字符串形式的——这也是它在数据库中的样子。最奇怪的是,这在 scotch.io 熊示例中运行良好。
    猜你喜欢
    • 2019-02-08
    • 2018-02-05
    • 2016-09-19
    • 1970-01-01
    • 2023-03-20
    • 2019-03-25
    • 1970-01-01
    相关资源
    最近更新 更多