図書館で借りた「超入門Node.js」2018年発行の第二版。こちらでNode.jsのお勉強を進めていましたが、5〜6年前に出版されたものなのでどうしても内容が古くなりがちで躓いてしまうことがありました。
ある程度サポートページの正誤表に記載はされているものの、それだけでも網羅できない壁が・・・。
学習を進める中で、私がつまづいた箇所と対処法のまとめです。
あくまでも本に沿って学習を進める際の対処法なので、実践で使えるかどうかは謎。
GoogleニュースのRSS取得
Chapter5で実践するGoogleニュースのRSSの取得。
本に記載の「path: ‘news?~」は使用できなくなっていて取得エラーになります。
pathを変更
var opt = {
host: 'news.google.com',
port: 443,
path: '/rss?hl=ja&ie=UTF-8&oe=UTF-8&gl=JP&ceid=JP:ja' //この部分
};
実行したところ取得に成功しました。
MySQLのパスワード
Chapter5でMySQLの導入学習があります。
私はもともとWordPressを触るためにMAMPを入れていたので、MySQLは同じものを使用しました。
この場合、パスワードの設定が必要になります。
var mysql_setting = {
host : 'localhost',
user : 'root',
password : '', //設定しているものを入れる
database : 'my-nodeapp-db'
}:
Express Validatorが使えない
Chapter6でバリデーションを行うためにExpress Validatorをインストールしました。
その後、add.js で読み込ませても認識してくれない・・・
正誤表ではVer.5をインストールし、コードを書き換えて対応するよう記載されいています。
バージョンを指定したインストール
npm install --save express-validator@5.3.1
が、getValidationResultメソッドが上手く動きませんでした。
Ver.6(現時点の最新)を使用した対処法を下記サイトで発見。
上手く動きました!(感謝)
Chapter7でもバリデーションコードの変更が必要
ミニ伝言板アプリを作ってみるところでもExpress Validatorを使用します。
最新版をインストールしたら、user.js内のコードを書き換えます。
/addのpost部分
router.post('/add', [
check('name','NAME は必ず入力して下さい。').not().isEmpty(),
check('password','PASSWORD は必ず入力して下さい。').not().isEmpty()
], (req, res, next) => {
var result = validationResult(req);
if (!result.isEmpty()) {
var content ='<ul class="error">';
var result_arr = result.array();
for(var n in result_arr) {
content += '<li>' + result_arr[n].msg + '</li>'
}
re += '</ul>';
var data = {
title: 'Users/Add',
content: content,
form: req.body
}
res.render('users/add', data);
} else {
req.session.login = null;
new User(req.body).save().then((model) => {
res.redirect('/');
});
}
});
/ のpost部分
router.post('/', [
check('name','NAME は必ず入力して下さい。').not().isEmpty(),
check('password','PASSWORD は必ず入力して下さい。').not().isEmpty()
],(req, res, next) => {
var result = validationResult(req);
if (!result.isEmpty()) {
var content = '<ul class="error">';
var result_arr = result.array();
for(var n in result_arr) {
content += '<li>' + result_arr[n].msg + '</li>'
}
content += '</ul>';
var data = {
title: 'Users/Login',
content: content,
form: req.body
};
res.render('users/login', data);
} else {
// 以下省略
Bookshelfがインストールできない
Chapter6でBookshelfをインストール手順で、インストールエラーになりました。
原因は先にインストールした、knexのバージョンにありました。
ターミナル(コマンドプロンプト)からインストールすると最新版がインストールされる為、bookshelfを使用する場合のknexバージョンに縛りがあることによりインストールできませんでした。
knex@”>=0.15.0 <0.22.0″ from bookshelf@1.2.0
エラーログによると、
0.15.01以上0.22.0未満のknexでbookshelf 1.2.0が使えるとのこと。
knexを一旦アンインストールして、バージョンを指定したインストールをします。
knexをアンインストール
npm uninstall knex
knexのバージョンを確認
npm view knex versions --json
上記のコマンドを実行すると、これまでのバージョンがずらずら〜〜っと表示されます。
0.22.0未満で一番新しいものは、0.21.21 だったので、こちらをダウンロードします。
npm install --save knex@0.21.21
その後、bookshelfをインストールすると無事成功しました。
Bookshelfのcoreファイル内に既にpaginationが組み込まれていてエラーになることがあるので、その場合は以下のコードを削除します。
Bookshelf.plugin('pagenation');
ログインエラーページにいかない
Chapter6のusers.jsと、Chapter7のlogin.jsで、入力された名前とパスワードを比較して、異なっていたらエラーを返す処理部分。
エラーページに移動する処理でEmptyResponseエラーになってしまい上手くいきませんでした。
本のコード
var nm = req.body.name;
var pw = req.body.password;
User.query({where: {name: nm}, andWhere{password: pw}})
.fetch()
.then((model) => {
//以下省略
実行されたクエリの結果が空のため、fetchでエラーになってしまうという状況。
fetchメソッドに結果が空の場合の対策をします。
.fetch({require: false})
このオプションを設定することによりエラー処理がうまくされるようになりました。
本の最新版
第2版でお勉強しましたが、今は第4版となっています。
内容も更新されているかな?