【发布时间】: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 并检查启动器列。我猜你要么有一个
<script src=,要么向它发出一个ajax请求。 -
是的,你是对的。
标签: javascript node.js mongodb mongoose