【问题标题】:Mongoose find callback function executing both if and else statementsMongoose find 回调函数同时执行 if 和 else 语句
【发布时间】:2018-07-22 03:22:23
【问题描述】:

我是 mongoose 和 Node 的新手,但这是我的页面显示一个露营地的路线。出于某种原因,findById 的回调函数同时运行下面的 if 和 else 语句。 所以我的代码可以找到正确的对象并将其显示在浏览器中,但它似乎也返回了一个未定义的对象。

另外,当我在回调函数中使用 console.log(camp.name) 时,它会抛出一个错误并说它不能引用 undefined 的 name 属性......所以它似乎正在引用一些未定义的对象,即使它确实找到了我要找的对象。

app.get("/campgrounds/:id",function(req, res){
    var camp_Id = req.params.id;
    console.log("ID type: "+ typeof(camp_Id) + " | "+camp_Id);

    var camps = Campground.findById(camp_Id, function(err,camp){
        console.log(camp);

        if (err){
            console.log(err);
        }
        else{
            res.render("show", {camp:camp});
        }
    });
});

这是控制台输出:

ID type: string | 5a80c8c54d30a717de9121f4
{ _id: 5a80c8c54d30a717de9121f4,
  name: 'Fire Camp',
  image: 'https://images.unsplash.com/photo-1496379590766-6732d042fef5?ixlib=rb-0.3.5&ixid=eyJhcHBfaWQiOjEyMDd9&s=65f8c4aa65a833e229c48dd9d3c2f12d&auto=format&fit=crop&w=1350&q=80',
  description: 'Fire and Camps and stuff. Best for smores.',
  __v: 0 }
ID type: string | campgrounds.js
undefined
{ CastError: Cast to ObjectId failed for value "campgrounds.js" at path "_id" for model "Campground"
    at MongooseError.CastError (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/error/cast.js:27:11)
    at ObjectId.cast (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/schema/objectid.js:158:13)
    at ObjectId.SchemaType.applySetters (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/schematype.js:701:12)
    at ObjectId.SchemaType._castForQuery (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/schematype.js:1072:15)
    at ObjectId.castForQuery (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/schema/objectid.js:198:15)
    at ObjectId.SchemaType.castForQueryWrapper (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/schematype.js:1041:15)
    at cast (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/cast.js:273:32)
    at Query.cast (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/query.js:3133:12)
    at Query._castConditions (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/query.js:1269:10)
    at Query._findOne (/home/ec2-user/environment/YelpCamp/node_modules/mongoose/lib/query.js:1485:8)
    at /home/ec2-user/environment/YelpCamp/node_modules/kareem/index.js:276:8
    at /home/ec2-user/environment/YelpCamp/node_modules/kareem/index.js:23:7
    at _combinedTickCallback (internal/process/next_tick.js:73:7)
    at process._tickCallback (internal/process/next_tick.js:104:9)
  message: 'Cast to ObjectId failed for value "campgrounds.js" at path "_id" for model "Campground"',
  name: 'CastError',
  stringValue: '"campgrounds.js"',
  kind: 'ObjectId',
  value: 'campgrounds.js',
  path: '_id',
  reason: undefined,
  model: 
   { [Function: model]
     hooks: Kareem { _pres: [Object], _posts: [Object] },
     base: 
      Mongoose {
        connections: [Object],
        models: [Object],
        modelSchemas: [Object],
        options: [Object],
        _pluralize: [Function: pluralize],
        plugins: [Object] },
     modelName: 'Campground',
     model: [Function: model],
     db: 
      NativeConnection {
        base: [Object],
        collections: [Object],
        models: [Object],
        config: [Object],
        replica: false,
        hosts: null,
        host: 'localhost',
        port: 27017,
        user: null,
        pass: null,
        name: 'YelpCamp',
        options: null,
        otherDbs: [],
        states: [Object],
        _readyState: 1,
        _closeCalled: false,
        _hasOpened: true,
        _listening: false,
        _connectionOptions: [Object],
        '$initialConnection': [Object],
        db: [Object],
        client: [Object] },
     discriminators: undefined,
     '$appliedMethods': true,
     '$appliedHooks': true,
     schema: 
      Schema {
        obj: [Object],
        paths: [Object],
        aliases: {},
        subpaths: {},
        virtuals: [Object],
        singleNestedPaths: {},
        nested: {},
        inherits: {},
        callQueue: [],
        _indexes: [],
        methods: {},
        statics: {},
        tree: [Object],
        query: {},
        childSchemas: [],
        plugins: [Object],
        s: [Object],
        _userProvidedOptions: undefined,
        options: [Object],
        '$globalPluginsApplied': true,
        _requiredpaths: [] },
     collection: 
      NativeCollection {
        collection: [Object],
        opts: [Object],
        name: 'campgrounds',
        collectionName: 'campgrounds',
        conn: [Object],
        queue: [],
        buffer: false,
        emitter: [Object] },
     Query: { [Function] base: [Object] },
     '$__insertMany': [Function],
     '$init': Promise { [Object], catch: [Function] } } }

编辑:这是我认为的代码:campgrounds.ejs:

<% for(var i=0; i < camps.length; i++){     %>

            <div class = "col-md-4 col-sm-6">
                <a href="/campgrounds/<%=camps[i].id%>">
                <div class = "img-thumbnail">
                    <img class="img-fluid" src="<%=camps[i]["image"]%>" alt="<%=camps[i]["name"]%>">
                    <div class="caption text-center"><%= camps[i]["name"] %></div>
                </div>
                </a>
            </div>

        <%    };    %>

【问题讨论】:

  • 在您的开发者工具网络选项卡中查看 campgrounds.js 并检查启动器列。我猜你要么有一个&lt;script src=,要么向它发出一个ajax请求。
  • 是的,你是对的。

标签: javascript node.js mongodb mongoose


【解决方案1】:

问题是您试图在这条路线中传递 :id 。如果您有类似“campgrounds/xyz”的路线并且位于“campgrounds/:id”路线下。然后它将“xyz”视为 :id 并尝试呈现此页面。

尝试将“campgroungs/:id”路线代码 sn-p 放在所有其他路线下并检查

【讨论】:

    【解决方案2】:

    这应该从

    Campground.findById(camp_Id, function(err,camp){
    

    到

    Campground.findById(new mongoose.Types.ObjectId(camp_Id), function(err,camp){
    

    【讨论】:

      【解决方案3】:

      你的错误可能在你看来,看第二条日志的id:

      ID type: string | campgrounds.js,

      当 id 为 campground.js 时,猫鼬告诉你它失败了:

      'Cast to ObjectId failed for value "campgrounds.js" at path "_id"

      您可能正在使用 campgrounds.js 作为 id 调用您的路线。

      【讨论】:

      • 嗯...不知道我是怎么做到的。我已经在我原来的问题上添加了视图代码。你能看一下吗?
      • 您确定在单击营地链接时没有对您的路线进行其他呼叫吗?也许在 jQuery 脚本中有一个事件监听器,用于 image-thumbnail div 或类似的东西
      • 是的,你是对的。我在页脚文件中包含了一个指向 campgrounds.js 的脚本标签。但是该文件中的 eventListener 只是假设引用了上一页上的 ID....无论如何,当我删除它时它起作用了。
      • 好吧,如果脚本标签 src 指向:/campgrounds/campground.js,那么当浏览器加载文件时就会进行调用。
      【解决方案4】:

      您似乎正在发出两个请求,一个是向“/campgrounds/5a80c8c54d30a717de9121f4”请求找到正确的对象,另一个是向“/campgrounds/campgrounds.js”请求返回未定义。

      【讨论】:

      • 是的,错误可能在视图中,在进行ajax调用或smtg时
      • 嗯...不知道我是怎么做到的。我已经在我原来的问题上添加了视图代码。你能看一下吗?
      • 在 camps 数组中,你是否有任何 camps[i].id 具有 'compground.js' 值?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      相关资源
      最近更新 更多