2017-09-12 18 views
0

Sails.jsブログアプリケーションにコメント機能を追加しようとしています。しかし、コントローラの動作を正しく書いていないようです。Sails.jsでPOSTリクエストを正しく処理できません。

コメントフォームを送信すると、ページがリロードされますが、リロードは完了しません。

は、ここに私のコントローラのコードです:

const gravatar = require('gravatar'); 

module.exports = { 

    blog: (req, res) => { 
     Post.find({}).exec((err, posts) => { 
      if (err) { 
       res.send(500, { error: 'Database Error' }); 
      } 

      res.view('all-posts', { posts }); 
     }); 

    }, 

    singlePost: (req, res) => { 
     Post.findOneBySlug(req.params.slug).exec((err, post) => { 
      if (err) { 
       res.send(500, { error: 'Database Error' }); 
      } 

      res.view('single-post', { 
       post, 
       gravatar: gravatar.url 
      }); 
     }); 
    }, 

addComment: (req, res) => { 
    const { 
     name, comment, email, 
     url, slug, 
    } = req.allParams(); 

    Post.findOneBySlug(slug).exec((err, post) => { 
     if (err) { 
      return res.send(500, { error: 'Database Error' }); 

      Comment.create({ 
       body: comment, name, email, website: url 
      }).exec((error, comment) => { 
       if (error) { 
        return res.send(500, { error: 'Database Error' }); 
       } 
       console.log(comment); 
       post.comments.addComment({slug, comment}); 
       post.save(); 

       res.redirect(`/${slug}`); 
      }); 
     } 
    }); 

    return false; 
}, 

}; 

そして、ここに私のroutes.jsファイルです:

module.exports.routes = { 
    'get /blog': 'BlogController.blog', 

    'get /:slug': 'BlogController.singlePost', 

    'post /:slug/new-comment': 'BlogController.addComment' 
}; 

そして、これは私のモデルPost.js

ので
module.exports = { 

    identity: 'Post', 

    attributes: { 

    title: { 
     type: 'string', 
     required: true, 
     unique: true 
    }, 

    body: { 
     type: 'string' 
    }, 

    categories: { 
     type: 'string', 
     required: true 
    }, 

    imageUrl: { 
     type: 'string' 
    }, 

    comments: { 
     collection: 'Comment', 
     via: 'post' 
    }, 

    slug: { 
     type: 'slug', 
     from: 'title', 
     blacklist: ['search', 'blog', 'contacts'] 
    } 
    }, 

    addComment: (options, cb) => { 
    Post.findOneBySlug(options.slug).exec((err, post) => { 
     if (err) return cb(err); 
     if (!post) return cb(new Error('Post not found.')); 

     post.comments.add(options.comment); 
     post.save(cb); 
    }) 
    }, 

    connection: 'mongodb' 
}; 

、あるとき、Iサブ/:slugページのコメントフォームに記入すると、実際には何も起こりませんが、ページを再読み込みしようとします。そして、データベースには何も保存されません。

フォームのパラメータがフォームから送信されるため、クライアント側ではすべて問題なく動作します。


どのように私はこの投稿要求に正しくアプローチしていますか?

答えて

1

現在、エラーの場合には、あなたのコードは、二回の応答を送信しようとすると、クライアントは、実際のエラーで応答を得ることはありませんので、あなたは、各res.send(500, ...);呼び出しの前にreturnステートメントを追加する必要があります。

if (err) { 
    return res.send(500, { error: 'Database Error' }); 
} 
... rest code 

私は、dbに何も保存されない理由は、要求本体の無効なパラメータであると考えられます。

+0

私の 'addComment'アクション(問題の更新されたコードを参照)を更​​新しましたが、問題は解決しません。 –

+0

コードを間違って変更しました。更新された回答を確認してください。 – alexmac

+0

無効なパラメータはどういう意味ですか? 'addComment'アクションの中で、' req.allParams() 'オブジェクトは、モデルを保存するのに必要なすべてのデータを含んでいます。 –

関連する問題