2017-09-05 5 views
0

私はこのブログアプリをbootcamp anndから作成しています。新しいブログを作成するフォームがデータベースにデータを戻さないというこのエラーが発生しました。データベースはそれを空に保存しています。私はmongodbを使用しています。私のデータベースが空のオブジェクトを格納しています。ここapp.jsnodejsフォームがreq.body.blogのデータを返信しない

var express = require("express"), 
app = express(), 
bodyparser = require("body-parser"), 
mongoose = require("mongoose"); 

mongoose.connect("mongodb://localhost/restful", { 
useMongoClient:true 
}); 

app.set("view engine", "ejs"); 
app.use(express.static("public")); 
app.use(bodyparser.json()); 

// app.use(bodyparser.json({ type: 'application/vnd.api+json' })); 
app.use(bodyparser.urlencoded({extended:true})); 

//MONGOOSE MODEL CONFIG 
//================================= 
var blogSchema = new mongoose.Schema({ 
title: String, 
image: String, 
body: String, 
created: Date //{type: Date, default : Date.now} 

}); 

var blog = mongoose.model("blog" , blogSchema); 

// blog.create([{ 
//  title: "test post", 
// image : 
"https://imagejournal.org/wpcontent/uploads/2017/08/17140945161_586d5e98f7_o-600x300.jpg", 
//  body : "This is the first post" 
// }, 
// { 
// title: "second Post", 
// image: "https://images.pexels.com/photos/33109/fall-autumn-red- 
season.jpg?h=350&auto=compress&cs=tinysrgb", 
// body: "this is a second post" 
// }] 
//); 

//RESTful routes 
//========================================== 
//========================================== 

//Home 

app.get("/",function(req,res){ 
res.redirect("/blogs"); 
}) 
//NEW ROUTE 

app.get("/blogs/new",function(req,res){ 
    res.render("new"); 
}); 

//CREATE ROUTE 
app.post("/blogs", function(req,res){ 
//create blogs 
blog.create(req.body.blog, function(err, newblog){ 
if(err){ 
console.log("This is if error " + err); 
res.render("new"); 
} 
else{ 
//then redirect to the INDEX 
res.redirect("/blogs"); 
console.log("This is if no error " + req.body.blog + " "+ err); 
} 
}); 
}); 

//SHOW ROUTE 
app.get("/blogs/:id", function(req,res){ 
blog.findById(req.params.id, function(err,foundblog){ 
if(err){ 
    res.redirect("/blogs"); 
} 
else{ 
    res.render("show", {blog: foundblog}); 
} 
}); 
}); 

//INDEX ROUTE 
app.get("/blogs", function(req,res){ 
blog.find({}, function(err,blogs){ 
    if(err) 
     { 
      console.log("error"); 
     } 
    else 
     { 
       res.render("index", {blogs:blogs}); 

     } 
    }) 
}); 



//listening port 

app.listen(3000,function(){ 
    console.log("Blog app running"); 
}) 

のためのTEのコードであり、フォームのコードはこれです:

今コンソールは今、「エラーなし未定義の場合はnullこれがある」

を印刷している

<% include ./partials/header.ejs %> 

<div class="ui main text container segment"> 
<div class="ui huge header">New Blog</div> 
<form class="ui form" action="/blogs" method="POST"> 
<div class="field"> 
    <label>Title</label> 
    <input type="text" name="blogtitle" placeholder="title"> 
</div> 
<div class="field"> 
    <label>Image</label> 
<input type="text" name="blogimage" placeholder="image"> 
</div> 
<div class="field"> 
<label>Body</label> 
<textarea name="blogbody" placeholder="Blog body goes here"></textarea> 
</div> 
<input class="ui inverted big olive button" type="submit" > 
</form> 

</div> 

<% include ./partials/footer.ejs %> 

私は私が

blog.create({ name: req.body.blogtitle, image:req.body.blogimage, body: 
req.body.blogbody} , function(err, newblog){...}); 

を渡さなかった何これは動作しているようだが、私はスキーマに多くのパラメータを持っていた場合、私は肝炎すべきですeこれを一つずつ宣言しますか?コースコルトではreq.body.blogとタイプし、すべてのデータが入っていると言っています。

私を助けてください!

+0

モデルを作成する前に 'req.body'を記録してみて、実際に何が得られているのか見てみましたか? – RaghavGarg

+0

私はconsole.logging req.bodyです。ブログ –

+0

あなたが従っているチュートリアルへのリンクを共有してください。 – RaghavGarg

答えて

0

のようにそれらをつかむために持っているあなたが得るreq.bodyのように:したがって、あなたが持っている

{ 
    blogtitle: 'your_blog_title', 
    blogimage: 'your_blog_image', 
    blogbody: 'your_blog_body' 
} 

すべてのモデルとすべてのフィールドについて、以下のコードで使用します。

blog.create({ 
    name: req.body.blogtitle, 
    image: req.body.blogimage, 
    body: req.body.blogbody 
},function(err, newblog){...}); 

しかし、あなただけの直接

// validate req.body.blog 
blog.create(req.body.blog, function(err, newblog){...}); 

を使いたいならば、あなたは以下のmodel[field]、サンプルコードのようなものをhtmlの定義する必要があります。

<form class="ui form" action="/blogs" method="POST"> 
    <div class="field"> 
    <label>Title</label> 
    <input type="text" name="blog[title]" placeholder="title"> 
    </div> 
    <div class="field"> 
    <label>Image</label> 
    <input type="text" name="blog[image]" placeholder="image"> 
    </div> 
    <div class="field"> 
    <label>Body</label> 
    <textarea name="blog[body]" placeholder="Blog body goes here"></textarea> 
    </div> 
    <input class="ui inverted big olive button" type="submit" > 
</form> 

req.body.blogを直接ご利用ください。 html入力に同じフィールド(列名)を指定する必要があります。

+0

ブログ[body]、ブログ[image]、ブログ[title] req.body.blogを使って作業していますが、フォーマット・モデル[field]でまだ表示されているビデオにあります。 ... –

+0

さて、あなたのコードを表示して、何が間違っているのか分かります。そして、あなたは何のビデオについて話しているのですか、私はビデオに関連する入力を見ることができません。 – RaghavGarg

+0

あなたのモデル[field]メソッドを再度使用して問題を解決しても構いません。 –

0

req.bodyのプロパティは、<form>の入力フィールドの属性のnameに対応します。 name="blog"の入力要素がないため、req.body.blogundefinedです。

console.log -ing req.bodyを試して、使用するプロパティを知るようにしてください。しかし、あなたの<form>に基づいて、req.bodyblogtitle,blogimageおよびblogbodyしか持たないでしょう。

+0

req.bodyを使用しているときにエラーが発生していない場合は[object Object] nullですが、問題はデータベースに入力されておらず、新しい投稿が空の投稿を作成しています –

0

入力名が分からないと思います。サーバー側のコードで使用すると、,blogimageblogbodyのようになります。 req.bodyは、このように移入さ:

{ blogtitle: 'your_blog_title',blogimage: 'your_blog_image',blogbody: 'your_blog_body' } 

だから、あなたのHTML入力によるreq.body.blogtitle

//CREATE ROUTE 
app.post("/blogs", function(req,res){ 
//create blogs 
blog.create(req.body.blogtitle, function(err, newblog){ 
if(err){ 
    console.log("This is if error " + err); 
    res.render("new"); 
} 
else{ 
//then redirect to the INDEX 
    res.redirect("/blogs"); 
    console.log("This is if no error " + req.body.blogtitle + " "+ err); 
} 
}); 
}); 
+0

3つの入力blogtitle、blogimage、 mongooseの作成関数は、私に定義されていないトークンエラーを通知します。 –

+0

私はbloggtitleを渡すと、私は私がフォームに入力したものを私に見せているが、同じものはデータベースに入っていない。 –

関連する問題