我可以显示 MongoDB collection 中的所有项目,但无法保存到它:"undefined"
I can display all items in my MongoDB collection, but can't save to it: "undefined"
我对Node.js比较陌生,目前,我正在尝试制作一个问答应用程序,以下功能与我的问题和我要做的事情有关。
列出来自 MongoDB 的所有讨论(有效)。
通过表单向 Mongodb.
添加带有属性的讨论:作者、标题、body
创建新讨论后,将被重定向到新创建讨论的详细信息页面。
这是我的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");
}
});
我对Node.js比较陌生,目前,我正在尝试制作一个问答应用程序,以下功能与我的问题和我要做的事情有关。
列出来自 MongoDB 的所有讨论(有效)。
通过表单向 Mongodb.
添加带有属性的讨论:作者、标题、body
创建新讨论后,将被重定向到新创建讨论的详细信息页面。
这是我的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");
}
});