POST后重定向到mongodb无法正常工作

时间:2015-06-15 08:07:59

标签: node.js mongodb redirect

我疯了!

我正在编写一个带有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加载一个...为什么??

0 个答案:

没有答案