我可以显示 MongoDB collection 中的所有项目,但无法保存到它:"undefined"

I can display all items in my MongoDB collection, but can't save to it: "undefined"

我对Node.js比较陌生,目前,我正在尝试制作一个问答应用程序,以下功能与我的问题和我要做的事情有关。

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

collection 的名称是 "discussions"。

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

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

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

已修复:但是,按下 /create 页面上的提交按钮不会执行任何操作。我一直盯着网上的教程看,但我找不到任何可以帮助我的东西。

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

提交有效,并转到 LH:3000/discussions/submit,但我的应用程序似乎找不到我的 collection。但是,LH:3000/discussions 列出了我的 MongoDB(Diskussr,collection:discussions)中当前的所有项目,因此它必须以某种方式正确链接。

一个console.log的collection也returns"undefined"。 这是错误:“无法调用未定义 的方法 'insert' **

这些是我的代码文件:

discussions.js -- /路线

    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

discussions.js -- /模型

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;

我的讲师让我post把这个发到 Whosebug,因为他不愿意自己帮我。

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.use() 代码添加到路由器上方 app.js 的任意位置。

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

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

Received: GET at /create

Received: POST at /submit

数据库问题

您的数据库查询的问题是您需要在讨论中调用插入,而不是 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");
    }
});