我疯了!
我正在编写一个带有node/mongoDB
的简单留言板,用户可以在其中打开线程并对其进行评论。
在向/newthread
发送POST后,将数据插入数据库(工作正常),我有一个重定向到文档的_id
,但是服务器崩溃了“无法读取未定义的postTitle”。
如果我然后重新启动服务器并导航到该线程(然后显示在索引页面上,因为它已正确插入),我可以毫无问题地查看该线程。
只有在我插入并重定向后,似乎没有找到任何文档。 我真的无法弄清楚为什么,有人可以帮忙吗?
//index.js
router.post('/newthread', function(req, res) {
threads.save(req, res);
});
//threads.js
var db = require('./db');
var uri = 'mongodb://localhost:27017/project';
var coll = 'documents';
var Oid = require('mongodb').ObjectId;
module.exports.loadAll = function(cb) {
db(uri, {}, function(err, db) {
db.collection(coll, function(err, collection) {
collection.find(
{
$query: {},
$orderby: { "bumpedAt": -1 }
}
).toArray(function(err, items) {
console.log("Found items: " + items.length);
cb(null, items);
})
});
})
};
module.exports.loadOne = function(id, cb) {
db(uri, {}, function(err, db) {
db.collection(coll, function(err, collection) {
if (err) {
console.log(err);
} else {
console.log("searching for id: " + id);
console.log("converted to Oid: " + new Oid(id));
collection.findOne({
_id: new Oid(id)
}, {}, function(err, item) {
if (err) {
console.log("error " + err);
cb(err);
} else if (item) {
console.log("Found item!");
console.dir(item);
cb(null, item);
} else {
console.log("Found NO items");
cb(err);
}
})
}
})
})
};
module.exports.save = function(req, res) {
db(uri, {}, function(err, db) {
db.collection(coll, function(err, collection) {
var time = new Date();
console.log("Saving...");
collection.insert({
"op" : req.body.username ||"Anonymous",
"postTitle" : req.body.posttitle || "No Title",
"postContent" : req.body.postcontent,
"createdAt" : time,
"bumpedAt" : time,
"comments" : []
}, function (err, doc) {
if (err) {
res.send ("Error while saving your post.")
} else {
console.log("Saved!");
console.dir(doc);
var threadId = new Oid(doc._id).toString();
res.location('/thread/' + threadId);
console.log("reloacting to " + threadId);
res.redirect('/thread/' + threadId);
console.log("redirecting to " + threadId);
}
})
})
})
};
//thread.js (route to /thread/:id)
router.get('/:id', function(req, res) {
console.log("loading " + req.params.id);
threads.loadOne(req.params.id, function(err, item) {
if (err) {
console.log(err);
} else {
res.render('showthread', {
title: item.postTitle,
posts: item
})
}
})
});
用于保存线程的控制台输出是:
Saving...
Saved!
{result: { ok: 1, n: 1 },
// ...
}
relocating to 557d2305be8e753b0e0cf70a
redirecting to 557d2305be8e753b0e0cf70a
POST /newthread 302 96.992 ms - 120
loading 557d2305be8e753b0e0cf70a
searching for id: 557d2305be8e753b0e0cf70a
converted to Oid: 557d2305be8e753b0e0cf70a
Found NO items
TypeError: Cannot read property 'postTitle' of undefined
at [...]/thread.js:16:28
我是否错误地访问了它?(即“title:item.postTitle”)
读取id
,它是正确的。在索引上,链接是从_id
生成的,所以这是完全正确的。如果我单击索引链接,我可以看到该线程。重定向(在POST之后)url甚至显示正确的链接(具有相同的id),但我发布后不能用该id加载一个...为什么??