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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Pug

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

PostgreSQL

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

Node.js

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

Q&A

1回答

576閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Pug

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

PostgreSQL

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

Node.js

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

0グッド

0クリップ

投稿2018/10/14 04:21

編集2018/10/14 05:45

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)

該当のソースコード

Javascript

1 2'use strict'; 3const pug = require('pug'); 4const Cookies = require('cookies'); 5const util = require('./handler-util'); 6const Post = require('./post'); 7 8const trackingIdKey = 'tracking_id'; 9 10function handle(req, res) { 11 const cookies = new Cookies(req, res); 12 addTrackingCookie(cookies); 13 14 switch (req.method) { 15 case 'GET': 16 res.writeHead(200, { 17 'Content-Type': 'text/html; charset=utf-8' 18 }); 19 Post.findAll({ order: [['id', 'DESC']] }).then((posts) => { 20 res.end(pug.renderFile('./views/posts.pug', { 21 posts: posts, 22 user: req.user 23 })); 24 console.info( 25 `閲覧されました: user: ${req.user}, ` + 26 `trackinId: ${cookies.get(trackingIdKey) },` + 27 `remoteAddress: ${req.connection.remoteAddress}, ` + 28 `userAgent: ${req.headers['user-agent']} ` 29 ); 30 }); 31 break; 32 case 'POST': 33 let body = []; 34 req.on('data', (chunk) => { 35 body.push(chunk); 36 }).on('end', () => { 37 body = Buffer.concat(body).toString(); 38 const decoded = decodeURIComponent(body); 39 const content = decoded.split('content=')[1]; 40 console.info('投稿されました: ' + content); 41 Post.create({ 42 content: content, 43 trackingCookie: cookies.get(trackingIdKey), 44 postedBy: req.user 45 }).then(() => { 46 handleRedirectPosts(req, res); 47 }); 48 }); 49 break; 50 default: 51 util.handleBadRequest(req, res); 52 break; 53 } 54} 55 56function handleDelete(req, res){ 57 switch(req.method){ 58 case 'POST': 59 let body = []; 60 req.on('data', (chunk) => { 61 body.push(chunk); 62 }).on('end', () => { 63 body = Buffer.concat(body).toString(); 64 const decoded = decodeURIComponent(body); 65 const id = decoded.split('id=')[1]; 66 Post.findById(id).then((post) => { 67 if(req.user === post.postedBy){ 68 post.destroy(); 69 } 70 handleRedirectPosts(req, res); 71 }) 72 }); 73 break; 74 default: 75 util.handleBadRequest(req, res); 76 break; 77 } 78} 79 80function addTrackingCookie(cookies) { 81 if (!cookies.get(trackingIdKey)) { 82 const trackingId = Math.floor(Math.random() * Number.MAX_SAFE_INTEGER); 83 const tomorrow = new Date(new Date().getTime() + (1000 * 60 * 60 * 24)); 84 cookies.set(trackingIdKey, trackingId, { expires: tomorrow }); 85 } 86} 87 88function handleRedirectPosts(req, res) { 89 res.writeHead(303, { 90 'Location': '/posts' 91 }); 92 res.end(); 93} 94 95module.exports = { 96 handle: handle, 97 handleDelete: handleDelete 98};

試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

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

javascript

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

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

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

投稿2018/10/14 15:13

yhg

総合スコア2161

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問