当前位置: 首页 > 知识库问答 >
问题:

mongoose不返回findById的输出

於鸿羲
2023-03-14

我正在学习nodejs和mongodb,并获得平均应用程序

我的系统规格是

Ubuntu 16.04(64位)
节点v 6.1.0
npm v 3.8.6

"mongodb":"^2.1.18",
"猫鼬":"^4.4.16","

到目前为止,我已经创建了模式,并通过终端使用db.locations.save()在mongob集合中添加了一个条目,并使用db.locations.find()获得生成的文档_id。

db。位置。查找()。终端中的pretty()返回低于输出的值

{
    "_id" : ObjectId("57428745e89f5c55e1d057dc"),
     // and many other path 
}

现在,当我在浏览器中打开/api/locations/57428745e89f5c55e1d057dc时,它既不给出结果也不结束请求。永久显示加载。。和邮递员一起测试的时候。

即使尝试使用错误的Id,也会返回正确的错误

{"消息":"Cast to ObjectId for value\"57428745e89f5c55e1d057dca\"at path\"_id\","name":"CastError","type":"ObjectId","value":"57428745e89f5c55e1d057dca","path":"_id"}

并且有正确的ID

console.log(mongoose.Types.ObjectId.isValid(req.params.locationid));  // return true

甚至试过

findOne({"_id":猫鼬。类型。ObjectId(req.params.locationid ) })

但是没有结果

可能是什么问题?猫鼬身上有什么虫子吗?下面是我的基本文件和所需的代码

require('./app_api/models/db');
var routesApi = require('./app_api/routes/index');
app.use('/api', routesApi);
var mongoose  = require( 'mongoose' );    
var mongoURI = 'mongodb://localhost/loc8r';    
var mongoDB = mongoose.createConnection(mongoURI);

mongoDB.on('connected', function (){
    console.log('mongoose connected to ' + mongoURI);
});

require('./locations');
var mongoose  = require( 'mongoose' );    
var openingTimeSchema = new mongoose.Schema({
days: {type: String, required: true},
opening: String,
closing: String,
closed: {type: Boolean, required: true}
});

var reviewSchema = new mongoose.Schema({
author: String,
rating: {type: Number, required: true, min: 0, max: 5},
reviewText: String,
createdOn: {type: Date, "default": Date.now}
});

var locationSchema = new mongoose.Schema({
    name: {type: String, required: true},
    address: String,
    rating: {type: Number, "default": 0, min: 0, max: 5},
    facilities: [String],
    coords: {type: [Number], index: '2dspehere'},
    openingTime: [openingTimeSchema],
    reviews: [reviewSchema]
});

mongoose.model('Location', locationSchema);
var express = require('express');
var router = express.Router();
var ctrlLocations = require('../controllers/locations');

/* Locations pages */
router.get('/locations/:locationid', ctrlLocations.locationsReadOne);
var mongoose = require('mongoose');
var Loc = mongoose.model('Location');

module.exports.locationsReadOne =  function (req, res) {
    if(req.params && req.params.locationid) {            
        Loc
        .findById(req.params.locationid)
        .exec(function(err, location) {
            if(err) {
                sendJsonResponse(res, 404, err);
                return;
            }
            if (!location) {
                sendJsonResponse(res, 404, {"message": "locationid not found"});
                return;
            }
            sendJsonResponse(res, 200, location);
        });
    } else {
         sendJsonResponse(res, 200, {"message": "no location id in request"});
    }
}

var sendJsonResponse = function(res, status, content) {
    res.status(status);
    res.json(content);
};

共有3个答案

司知
2023-03-14

我有一个类似的问题,所以我更新了我的模型文件。对于例如。

const workoutsSchema = new Schema({
  _id: mongoose.ObjectId,
  email_add: String,
  workout_date: String,
  workout_duration: String
});

在控制器中:-

  router.route("/workouts/:id").get(function(req, res) {
  console.log("Fetch Workouts of="+req.params.id);
  var id = new mongoose.Types.ObjectId(req.params.id);
  Workouts.findById(id, function(err, workout) {
        if (err)
            res.send(err)
        res.json(workout);
    });
});
党俊健
2023-03-14

从mongoose文档中获取解决方案

重要的如果您使用mongoose打开了单独的连接。createConnection(),但尝试通过mongoose访问模型。model('ModelName')由于未连接到活动数据库连接,因此无法按预期工作。在这种情况下,通过您创建的连接访问您的模型:

因此,改变我创建连接的方式

//var mongoDB = mongoose.createConnection(mongoURI);
mongoose.connect(mongoURI);

还需要注释所有其他使用mongoDB变量的函数/表达式

替代方法:(如果你不想改变mongoDB在db.js)

在控制器/位置中。js

更改var Loc=mongoose。模型(“位置”) 在下面一行

var conn = mongoose.createConnection('mongodb://localhost/loc8r');
var Loc = mongoose.model('Location');

顾学真
2023-03-14

1.控制台您的请求。if之前的参数

Loc8R/app_api/控制器/locations.js

var mongoose = require('mongoose');
var Loc = mongoose.model('Location');

module.exports.locationsReadOne =  function (req, res) {

console.log(req.params)

    if(req.params && req.params.locationid) {            
        Loc
        .findById(req.params.locationid)
        .exec(function(err, location) {
            if(err) {
                sendJsonResponse(res, 404, err);
                return;
            }
            if (!location) {
                sendJsonResponse(res, 404, {"message": "locationid not found"});
                return;
            }
            sendJsonResponse(res, 200, location);
        });
    } else {
         sendJsonResponse(res, 200, {"message": "no location id in request"});
    }
}

var sendJsonResponse = function(res, status, content) {
    res.status(status);
    res.json(content);
};

如果参数为空,或者控制台不工作,那么检查您的路由路径

 类似资料:
  • 我想知道是否有任何方法可以更改由猫鼬,和方法返回的文档对象的可用字段的值,并通过应用到数据库中的更改来更新它们。下面的代码片段是我期望完成我想要的工作:

  • 当我试图更改Mongoose查询返回的数据的任何部分时,它没有任何效果。 昨天我花了大约两个小时试图弄明白这一点,各种各样的s,使用临时存储变量等。最后,就在我觉得自己疯了的时候,我找到了一个解决方案。所以我想到了未来的某个人(Fyuuture!)可能存在保存问题。

  • 我一直在研究猫鼬文档,但我找不到一种方法来实现我想要做的事情。考虑一个MangGDB用户集合。还可以考虑一个包含DB集合中所有字段的蒙古人用户模式。 现在,我想登录到控制台,所有用户,但属性已更改。有点像: 用户。图例(): 给定的异步类型。find()函数我不确定这是否可以实现。我来自C#和PHP背景,只处理关系数据库,这可以通过在用户类中使用只返回所需值的函数轻松实现。 能做到吗?!

  • 来自Mongo Shell 工作并将记录打印到屏幕上。 从快递 我每次都得到空响应。我尝试过不使用ObjectId包装,但我仍然得到空值。mongoDB连接很好,因为我有一个成功返回所有消息。 我做错了什么?

  • 我有两个模型;一个用于用户,另一个用于学习组。每个StudyGroup都有一个唯一的字段。用户模型有一个studyGroups字段,它是字符串的数组。一个用户可以加入多个学习组。 用户模型

  • 为了学习平均堆栈(使用Mongoose),我创建了一个StackOverflow类型的应用程序。我有存储在Mongo(v3.0.7)中的问题,它们有答案子文档。 我试图增加一个答案的投票数,但当问题返回时,它是空的。我非常肯定查询有问题,特别是我试图用需要修改的ID得到答案的地方。 查询0票有效: 更新:通过Mongo查询,返回结果: 但是,通过Mongoose返回NULL: