我可以在MongoDB集合中显示所有项目,但不能保存到它:" undefined"

时间:2015-04-30 14:12:03

标签: node.js mongodb sockets express mongoose

我对Node.js相对较新,目前,我正在尝试制作Q& A应用程序,以下功能与我的问题以及我必须做的事情相关。

  • 列出MongoDB的所有讨论(可行)。

  • 通过表单添加与属性:author,title,body的讨论到Mongodb。

  • 创建新讨论后,重定向到新制作的讨论的详细信息页面。

这是我的MongoDB结构:mongodb:// localhost / Diskussrdb

该系列的名称是"讨论"。

目前,我可以在localhost:3000 / discussion

上查看我的所有数据库记录

包含用于创建新讨论的表单的页面位于localhost:3000 / discuss / create

已修复:但是,按/创建页面上的提交按钮不会执行任何操作。我一直盯着自己在线阅读教程,但我无法找到任何可以帮助我的东西。

已修复:新问题:提交现在有效,但在地址上返回404" localhost:3000 / submit"。我在/ submit router.post中添加了一个console.log但它在我的提示符中没有显示。

提交有效,并转到LH:3000 / discussion / submit,但似乎我的应用无法找到我的收藏。但是,LH:3000 /讨论列出了MongoDB中当前存在的所有项目(Diskussr,集合:讨论),因此必须以某种方式正确链接。

该集合的console.log也返回" undefined"。 这是错误:"无法调用方法'插入'未定义 **

这些是我的代码文件:

discussion.js - / routes

    var mongoose = require('mongoose');
var express = require('express');
var router = express.Router();
var Discussion = require('../models/discussions');

router.get('/', function(req, res, next){

    // alle db records uitlussen, op render alldiscussions
    var db = req.db;
    Discussion.find({},{},function(e,docs){
        res.render('all_discussions', {
            "all_discussions" : docs
        });
        console.log(docs);
    });
});

router.get('/create', function(req, res, next){
    res.render('add_discussion', {title: 'Diskussr'});

});

router.post('/submit', function(req, res) {

    //set DB
    var db = req.db;

    //form vals
    var author = req.body.name;
    var title = req.body.title;
    var body = req.body.body;

    //set collection
    var collection = db.get('discussions');

    //insert
    collection.insert({
        "author" : author,
        "title" : title,
        "body" : body
    }, function (err, doc) {
        if (err) {
            res.send("Database submit error");
        }
        else {
            res.location("all_discussions");
            res.redirect("all_discussions");
        }
    });

});

module.exports = router;

add_discussion.jade - / views

extends layout

block content
  h1 Start a discussion
  p Start a discussion here on #{title} and help eachother out.
  p Voeg hier uw vraag in:
  form(action="/submit" method="post" name="submit_discussion")
  input(id="name", placeholder="Your name" name="name")
  br
  br
  input(id="title", placeholder="Brief summary of your problem." name="title")
  br
  br
  input(id="body", placeholder="Explain your problem." name="body")
  br
  br
  button(type="sumbit" id="submit" value="submit") Submit
  br

discussion.js - / models

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

//schema discussions
var DiscussionSchema = new Schema({
    author: String,
    title: String,
    body: String,
    category: String,
    created: Date
},
{ collection : 'discussions' });

// model
var Discussion = mongoose.model('Discussion', DiscussionSchema, 'discussions');

// test functie: aanmaken vraag on load
// var firstDiscussion = new Discussion({author: "Testuser 1", title: "Testvraag via models"});
// console.log(firstDiscussion);

// //vraag saven
//  firstDiscussion.save(function (err, firstDiscussion){
//      if (err) return console.error(err);
//  });





module.exports = Discussion;

我的讲师告诉我把它发布到StackOverflow,因为他不愿意帮我自己。

1 个答案:

答案 0 :(得分:0)

Jade是空格敏感的,如果你想让html元素包含在另一个中,比如表单标签,你需要缩进它们。

block content
  h1 Start a discussion
  p Start a discussion here on #{title} and help eachother out.
  p Voeg hier uw vraag in:

  form(action="/submit" method="post" name="submit_discussion")
      input(id="name", placeholder="Your name" name="name")
      br
      br
      input(id="title", placeholder="Brief summary of your problem." name="title")
      br
      br
      input(id="body", placeholder="Explain your problem." name="body")
      br
      br
      button(type="sumbit" id="submit" value="submit") Submit
      br

我建议使用调试器。要立即查看正在发生的事情,您可以向router.post添加一个控制台输出,以检查它是否实际被调用,如下所示:

router.post('/submit', function(req, res) {
    console.log("POST received");
    // etc
}

进一步调试:

在路由器上方的app.js中的任何位置添加此app.use()代码。

app.use(function(req, res, next) {
    console.log("Received: " + req.method + " at " + req.originalUrl);
    next();
});

每次你的应用收到请求时都会调用它,然后是next();移动到您的路由器。所以你会看到:

  

收到:GET at / create

     

收到:POST / submit

数据库问题

您的数据库查询的问题是您需要在Discussion上调用insert,而不是db.collection.get('Discussion');

尝试:

Discussion.insert({
    "author" : author,
    "title" : title,
    "body" : body
}, function (err, doc) {
    if (err) {
        res.send("Database submit error");
    }
    else {
        res.location("all_discussions");
        res.redirect("all_discussions");
    }
});