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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

2回答

1341閲覧

Express Validatorでバリデーションができない

jsrookie

総合スコア24

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Node.js

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

0クリップ

投稿2019/09/23 09:48

発生している問題

現在、【Node.js 超入門 第2版 掌田津耶乃 著】という本でデータベースの勉強をしています。
その本のchapter6でExpress Validatorを使用し入力チェックをする所があるのですが、

error

1TypeError: req.check is not a function 2 at router.post (C:\Users\user\Desktop\ex-gen-app\routes\hello.js:48:9) 3 at Layer.handle [as handle_request] (C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\layer.js:95:5) 4 at next (C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\route.js:137:13) 5 at Route.dispatch (C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\route.js:112:3) 6 at Layer.handle [as handle_request] (C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\layer.js:95:5) 7 at C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\index.js:281:22 8 at Function.process_params (C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\index.js:335:12) 9 at next (C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\index.js:275:10) 10 at Function.handle (C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\index.js:174:3) 11 at router (C:\Users\user\Desktop\ex-gen-app\node_modules\express\lib\router\index.js:47:12)

というエラーが出てしまい、先へ進めません。

本に従い、フォルダex-gen-appにExpressGeneratorをインストールし、生成されたフォルダroutes内にhello.js、フォルダviews内にフォルダhelloを作り、add.ejsを入れています。

hello.jsの48行目のreq.checkでエラーが発生しました。
また、req.checkの次のreq.getValidationResult()も同様のエラーが発生しました。
checkはExpress Validatorに入っている関数だと思っているのですが、app.jsの
var validator = require("express-validator");
app.use(validator()); 
だけではダメなのでしょうか?

Node.jsは始めたばかりなので原因が分かりません。

解決のためご教授お願いします。

該当のソースコード

↓ex-gen-app\app.js

var createError = require('http-errors'); var express = require('express'); var path = require('path'); var cookieParser = require('cookie-parser'); var logger = require('morgan'); var indexRouter = require('./routes/index'); var usersRouter = require('./routes/users'); var hello = require('./routes/hello'); var validator = require("express-validator"); var app = express(); // view engine setup app.set('views', path.join(__dirname, 'views')); app.set('view engine', 'ejs'); app.use(logger('dev')); app.use(express.json()); app.use(express.urlencoded({ extended: false })); app.use(cookieParser()); app.use(express.static(path.join(__dirname, 'public'))); app.use('/', indexRouter); app.use('/users', usersRouter); app.use('/hello', hello); app.use(validator());  // catch 404 and forward to error handler app.use(function(req, res, next) { next(createError(404)); }); // error handler app.use(function(err, req, res, next) { // set locals, only providing error in development res.locals.message = err.message; res.locals.error = req.app.get('env') === 'development' ? err : {}; // render the error page res.status(err.status || 500); res.render('error'); }); module.exports = app;

↓ex-gen-app\routes\hello.js

var express = require('express'); var router = express.Router(); var mysql = require("mysql"); //MySQLの設定情報 var mysql_setting = { host : "localhost", user : "root", password : "", database : "my-nodeapp-db" }; //GETアクセスの処理 router.get('/', (req, res, next) => { //コネクションの用意 var connection = mysql.createConnection(mysql_setting); //データベースに接続 connection.connect(); //データを取り出す connection.query("SELECT * from mydata", function(error, results, fields){ //データベースアクセス完了時の処理 if (error == null){ var data = {title:"mysql", content:results}; res.render("hello/index", data); } }); //接続を解除 connection.end(); }); //ADD //新規ページへのアクセス router.get("/add", (req, res, next) => { var data = { title: "Hello/Add", content: "新しいレコードを入力", form: {name:"", mail:"", age:0} } res.render("hello/add", data); }); //新規作成フォーム送信の処理 router.post("/add", (req, res, next) => { req.check("name", "NAMEは必ず入力して下さい。").notEmpty(); //問題の関数 req.check("mail", "MAILはメールアドレスを記入して下さい。").isEmail(); req.check("age", "AGEは年齢(整数)を入力して下さい。").isInt(); req.getValidationResult().then((result) => { if (!result.isEmpty()) { var re = '<ul class="error">'; var result_arr = result.array(); for (var n in result_arr){ re += '<li>' + result_arr[n].msg + '</li>' } re += '</ul>'; var data = { title: "Hello/Add", content: re, form: req.body } res.render("hello/add", data); } else { var nm = req.body.name; var ml = req.body.mail; var ag = req.body.age; var data = {"name":nm, "mail":ml, "age":ag}; //データベースの設定情報 var connection = mysql.createConnection(mysql_setting); //データベースに接続 connection.connect(); //データを取り出す connection.query("insert into mydata set ?", data, function (error, results, fields) { res.redirect("/hello"); }); //接続を解除 connection.end(); } }); }); module.exports = router;

↓ex-gen-app\views\hello\add.ejs

<!DOCTYPE html> <html lang="ja"> <head> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <title><%=title %></title> <script src="https://code.jquery.com/jquery.min.js"></script> <link rel="stylesheet" href="/stylesheets/style.css" /> </head> <body> <head> <h1><%=title %></h1> </head> <div role="main"> <p><%= content %></p> <form method="post" action="/hello/add"> <table> <tr> <th>NAME</th> <td><input type="text" name="name" value="<%= form.name %>"></td> </tr> <tr> <th>MAIL</th> <td><input type="text" name="mail" value="<%= form.mail %>"></td> </tr> <tr> <th>AGE</th> <td><input type="text" name="age" value="<%= form.age %>"></td> </tr> <tr> <th></th> <td><input type="submit" name="作成"></td> </tr> </table> </form> </div> </body> </html>

↓package.json

{ "name": "ex-gen-app", "version": "0.0.0", "private": true, "scripts": { "start": "node ./bin/www" }, "dependencies": { "bookshelf": "^1.0.0", "cookie-parser": "~1.4.4", "debug": "~2.6.9", "ejs": "~2.6.1", "express": "~4.16.1", "express-generator": "^4.16.1", "express-session": "^1.16.2", "express-validator": "^5.3.1", "http-errors": "~1.6.3", "jquery": "^3.4.1", "knex": "^0.14.6", "morgan": "~1.9.1", "mysql": "^2.17.1", "xml2js": "^0.4.22" } }

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

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

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

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

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

guest

回答2

0

あなたのソースだと、新しい書き方はこんな感じになります。

const {check, validationResult} = require('express-validator'); router.post('/add', [ check('name', 'NAME は必ず入力してください。').isLength({min: 1}), check('mail', 'MAIL はメールアドレスを入力してください。').isEmail(), check('age', 'AGE は年齢(整数)を入力してください。').isInt({min: 1}) ], (req, res, next) => { let result = validationResult(req); if (!result.isEmpty()) { ........ ........ res.render('hello/add', data); } else { ........ ........ connection.end(); } });

投稿2020/03/22 02:28

technocore

総合スコア7200

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

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

0

使用しているExpress Validator のバージョンアップに伴う仕様変更のためエラーが発生していると考えられます。
公式サイトの正誤表に以下のような記載がありました。

本書で使用している Express Validator は、現在 ver.6 となり、仕様が変更されているため、本書の記述の通りでは正常

に動作しなくなっています。

私の場合、正誤表の案内に従い ver.5 にバージョンダウンすることで、書籍のサンプルコードで動作することを確認できました。

また、express-varidator公式サイトの説明に従いコードを修正すると最新バージョンでも動かす事が出来たので、勉強も兼ねてそちらも試してみるのもオススメです。
個人的に作成していた修正版のコードはQiitaで公開していますので、よければ参考にしてください。
『Node.js 超入門』の express-validation を最新の仕様に修正する


追記

すみません、質問で書かれている package.json の内容を確認したらバージョンは5.3なので別の原因かもしれないです。
app.js の記述箇所に問題があるのではないでしょうか?モジュール利用時の文を追記する位置について、P.253 にて以下のような説明があります。

Expressでは、さまざまなモジュールをロードして使いますが、こうしたモジュールをapp.useで利用するための文は、「routes」フォルダのスクリプトをルーティングに割り付けるためのapp.useより前に用意するように注意して下さい。

質問に記載されているapp.jsでは以下のようにapp.use(validator());がルーティングの後に記載されています。

app.use('/', indexRouter); app.use('/users', usersRouter); app.use('/hello', hello); app.use(validator()); 

この文から、app.use(validator());をルーティング処理の前(app.use('/', indexRouter);より上)に記載するように修正することで問題が解決するかと思います。
なお、書籍のサンプルコードではapp.jsは下記のように順序で記載されていましたので、こちらも参考にして下さい。

// validator var validator = require('express-validator'); app.use(validator()); app.use('/', indexRouter); app.use('/users', usersRouter); // add hello. var hello = require('./routes/hello'); app.use('/hello', hello); var ajax = require('./routes/ajax'); app.use('/ajax', ajax);

投稿2020/03/22 02:19

編集2020/03/22 13:32
Bouya

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問