発生している問題
現在、【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" } }
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。