質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Node.js

    1861questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • PostgreSQL

    1062questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • Pug

    29questions

    Pug(旧Jade)とは、HTMLを書くためのテンプレートエンジン。タグで囲む必要がないなど記述を省略できるため、HTMLの記述が簡単になります。ファイル分割も可能で、変数やループなど便利な機能も備わっています。

Unhandled rejection TypeError: Cannot read property 'postedBy' of nullの解決

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 29

satuki_2528

score 0

 Javascriptのコードのエラーの原因と対策を突き止めたい。

秘密の匿名掲示板の削除機能の実装途中にエラーが出ました。
削除ボタンUI作成はうまくいったのですが、削除処理の実装して
削除ボタンを押しても消えないため。端末を見たらエラーメッセージが
表示されてました。

 発生している問題・エラーメッセージ

Unhandled rejection TypeError: Cannot read property 'postedBy' of null
    at Post.findById.then (/home/satuki/workspace/secret-board-3024/lib/posts-handler.js:66:32)
    at tryCatcher (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/util.js:16:23)
    at Promise._settlePromiseFromHandler (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/promise.js:512:31)
    at Promise._settlePromise (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/promise.js:569:18)
    at Promise._settlePromise0 (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/promise.js:614:10)
    at Promise._settlePromises (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/promise.js:694:18)
    at _drainQueueStep (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/async.js:138:12)
    at _drainQueue (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/async.js:131:9)
    at Async._drainQueues (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/async.js:147:5)
    at Immediate.Async.drainQueues [as _onImmediate] (/home/satuki/workspace/secret-board-3024/node_modules/bluebird/js/release/async.js:17:14)
    at runCallback (timers.js:694:18)
    at tryOnImmediate (timers.js:665:5)
    at processImmediate (timers.js:647:5)

 該当のソースコード

'use strict';
const pug = require('pug');
const Cookies = require('cookies');
const util = require('./handler-util');
const Post = require('./post');

const trackingIdKey = 'tracking_id';

function handle(req, res) {
  const cookies = new Cookies(req, res);
  addTrackingCookie(cookies);

  switch (req.method) {
    case 'GET':
      res.writeHead(200, {
        'Content-Type': 'text/html; charset=utf-8'
      });
      Post.findAll({ order: [['id', 'DESC']] }).then((posts) => {
        res.end(pug.renderFile('./views/posts.pug', {
          posts: posts,
          user: req.user
        }));
        console.info(
          `閲覧されました: user: ${req.user}, ` +
          `trackinId: ${cookies.get(trackingIdKey) },` +
          `remoteAddress: ${req.connection.remoteAddress}, ` +
          `userAgent: ${req.headers['user-agent']} `
          );
      });
      break;
    case 'POST':
      let body = [];
      req.on('data', (chunk) => {
        body.push(chunk);
      }).on('end', () => {
        body = Buffer.concat(body).toString();
        const decoded = decodeURIComponent(body);
        const content = decoded.split('content=')[1];
        console.info('投稿されました: ' + content);
        Post.create({
          content: content,
          trackingCookie: cookies.get(trackingIdKey),
          postedBy: req.user
        }).then(() => {
          handleRedirectPosts(req, res);
        });
      });
      break;
    default:
      util.handleBadRequest(req, res);
      break;
  }
}

function handleDelete(req, res){
  switch(req.method){
    case 'POST':
      let body = [];
      req.on('data', (chunk) => {
        body.push(chunk);
      }).on('end', () => {
        body = Buffer.concat(body).toString();
        const decoded = decodeURIComponent(body);
        const id = decoded.split('id=')[1];
        Post.findById(id).then((post) => {
          if(req.user === post.postedBy){
          post.destroy();
        }
        handleRedirectPosts(req, res);
      })
      });
      break;
      default:
        util.handleBadRequest(req, res);
        break;
    }
}

function addTrackingCookie(cookies) {
  if (!cookies.get(trackingIdKey)) {
    const trackingId = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER);
    const tomorrow = new Date(new Date().getTime() + (1000 * 60 * 60 * 24));
    cookies.set(trackingIdKey, trackingId, { expires: tomorrow });
  }
}

function handleRedirectPosts(req, res) {
  res.writeHead(303, {
    'Location': '/posts'
  });
  res.end();
}

module.exports = {
  handle: handle,
  handleDelete: handleDelete
};

 試したこと

console.log(post)でpostの内容を見たこと、でも理解出来なかった。

 補足情報(FW/ツールのバージョンなど)

N予備校 プログラミングWebアプリ入門 テキスト24
Git
Pug
Javascipt
Node.js
PostgreSQL

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

下記コードのpostnull、つまり該当する投稿が見つからないためにエラーが出てるのではないかと思います。

Post.findById(id).then((post) => {
  // null には postedBy メソッドが存在しないのでエラー
  if (req.user === post.postedBy) {
    post.destroy();
  }
  handleRedirectPosts(req, res);
});

フロントエンドで送信する段階でidが間違っているか、クエリー文字列からidを取り出した際に間違ったidになってしまっているか、Post.findByIdメソッドの実装に不具合があるかのどれかかなと思います。

とりあえずこのままだと id=***&hoge=fooのように他のパラメータを後ろに付けて送信することができなかったりするので、クエリー文字列をパースする際には query-string などのパッケージを使うのが無難だと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Node.js

    1861questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

  • PostgreSQL

    1062questions

    PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

  • Pug

    29questions

    Pug(旧Jade)とは、HTMLを書くためのテンプレートエンジン。タグで囲む必要がないなど記述を省略できるため、HTMLの記述が簡単になります。ファイル分割も可能で、変数やループなど便利な機能も備わっています。