bugfix> javascript > 投稿

これはスキーマの定義方法に関連していると思いますが、バグの場所を見つけることができないようです...完璧に機能するほぼ同一のファイル設定があり、残念ながら見つけることができませんでしたどこでもこの問題の複製。

Postmanを介してローカルのExpressインスタンスにAPIリクエストを送信する場合、「title」リクエスト本文の値のみがデータベースに保存されます。次の簡単なリクエストをApplication/Jsonとして自分のルートに送信しています(x-www-form-urlencodedを使用している場合も同様です):

{
    "postTitle": "title goes here",
    "postContent": "body goes here",
    "isPublished": true
}

これは明らかにオブジェクトをログに記録するように、このデータ(およびタイムスタンプと_id)を見ることができるように、明白に登録されています。

{ _id: 5b07d9c0b8124e0599079c04,
  postTitle: 'title goes here',
  postContent: 'body goes here',
  isPublished: true,
  createdAt: 2018-05-25T09:39:12.869Z,
  updatedAt: 2018-05-25T09:39:12.869Z,
  __v: 0 }

ただし、IDを使用してこのオブジェクトのルートにget要求を送信すると、応答として次のメッセージが表示されます。

{ "_id": "5b07d9c0b8124e0599079c04" }

同様に、すべてのオブジェクトをリストする要求を送信すると、次の応答が返されます。

{
    "posts": [
        {
            "_id": "5b07d9c0b8124e0599079c04"
        },
        {
            "_id": "5b07d9c0b8124e0599079c03"
        },
        {
            "_id": "5b07d9914f10ce058f137eba"
        }
    ]
}

奇妙なことに、応答の一部として送信された投稿のタイトルが応答に含まれる場合と含まれない場合があります。

私のスキーマは次のとおりです。

var postSchema = new Schema({
  postTitle: String,
  postContent: String,
  isPublished: Boolean
},
{
  timestamps: true
});

POSTリクエストの私の投稿APIルートは次のとおりです。

router.post('/posts', (req, res, next) => {
  var postTitle = req.body.postTitle;
  var postContent = req.body.postContent;
  var isPublished = req.body.isPublished;
  var newPost = new Post({
    postTitle: postTitle,
    postContent: postContent,
    isPublished: isPublished
  });
  newPost.save(function (error) {
    if (error) {
      console.log(error)
    }
    res.send({
      success: true,
      message: 'Post saved successfully!'
    })
  })
});

(ルーターを使用していない場合は、「router.post」の代わりに「app.post」が使用されます)繰り返しますが、これは少し時間がかかりますが、すべて正常に動作します。

私のGETルートは次のとおりです。

router.get('/posts', (req, res) => {
  Post.find({}, 'title content published', function (error, posts) {
    if (error) { console.error(error); }
    res.send({
      posts: posts
    })
  }).sort({_id:-1})
});

回答 1 件
  • OK-したがって、コードを詳細に調べて、どこが間違っているのかを見つけて問題を修正しましたが、検索では結果のほとんどが見つかりませんでした。私はExpressにかなり慣れていないので、同じ愚かな間違いを犯した場合に他の人の時間を大幅に節約できるように、問題の原因と解決方法を概説します。

    さて、私が問題を抱えているのは、データを取得し、リクエストの取得に応じてデータを提供する方法から結果を得ているからです。例として、すべてのオブジェクトをリストするGETルートを次に示します。

    私は完全に投稿リクエストに焦点を当てており、それがデータベースの問題であると想定していました。実際に行ったことは、スキーマとルートの混乱を少なくするためであり、関連する変数の名前を変更しました。ただし、忘れていたのは、変更を反映するためにGETルートのこの行を更新することです。

     Post.find({}, 'postTitle postContent isPublished', function (error, posts) {
    
    

    私が残したもの:

     Post.find({}, 'title content published', function (error, posts) {
    
    

    タイトルが時々表示されるのは、変更を前後に元に戻して問題を特定しようとしたためです。

    私はこれが非常に基本的なクエリであることを知っていますが、1日の大半でこれにこだわっており、これに関する他の関連する議論はOPが魔法のように修正されたと言って終わりました。

あなたの答え