我对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,因为他不愿意帮我自己。
答案 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");
}
});