【问题标题】:I can display all items in my MongoDB collection, but can't save to it: "undefined"我可以显示我的 MongoDB 集合中的所有项目,但不能保存到它:“未定义”
【发布时间】:2015-07-10 07:02:45
【问题描述】:

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

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

  • 通过表单向 Mongodb 添加具有属性的讨论:作者、标题、正文。

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

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

集合的名称是“讨论”。

目前,我可以在 localhost:3000/discussions 上查看我的所有数据库记录

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

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

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

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

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

这些是我的代码文件:

discussions.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

discussions.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,因为他不愿意亲自帮助我。

【问题讨论】:

  • 在 router.post('/submit', function(req, res) { ... } 中设置断点会发生什么?

标签: node.js mongodb sockets express mongoose


【解决方案1】:

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

收到:在 /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");
    }
});

【讨论】:

  • 感谢您的回答,您对我在哪里可以找到适合 Jade 的调试器有什么建议吗?
  • 有很多用于调试 NodeJS 的资源。如果你在 Windows 上工作,你可以获得 Visual Studio 社区版,并下载 NodeJS 工具,全部免费。您还可以获得更轻量级的 Visual Studio Code,微软刚刚发布了用于调试 NodeJS,可用于 OS X、Windows 和 Linux。也可以通过Cloud9在线开发,自带调试器,只需要一个网页浏览器,一个项目也是免费的。
  • 你的缩进解决方案成功了,提交现在做了一些事情,但 POST 似乎不起作用,我没有得到 console.log 并且没有数据保存到数据库中。跨度>
  • 按提交后你会去预期的地址吗?有关更多调试,请参阅我的更新答案。
  • 好消息,我现在可以按下提交按钮,它会从 localhost:3000/discussions/create 转发到 LH:3000/discussions/submit,但是,我的收藏出现错误.我会把它们放在这里,我会更新问题。错误:“无法调用未定义的方法‘插入’”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 1970-01-01
  • 2022-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多