TypeError: req.checkBody(...).optional(...).isDate is not a function
TypeError: req.checkBody(...).optional(...).isDate is not a function
我在使用 express 验证器时遇到问题,特别是 isDate 函数。我已经采取措施使用 expressvalidator、bodyparse、validator 模块等。所有路由仅在此之后..
环境是 Node + Express。
问题出在
的用法上
"req.checkBody('date_of_birth', 'Invalid date').optional({ checkFalsy: true }).isDate();"
我不断收到以下 错误。
TypeError: req.checkBody(...).optional(...).isDate is not a function
at exports.author_create_post (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/controllers/authorController.js:47:81)
at Layer.handle [as handle_request] (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/layer.js:95:5)
at /Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:335:12)
at next (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:275:10)
at Function.handle (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:174:3)
at router (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:47:12)
at Layer.handle [as handle_request] (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:317:13)
at /Users/svitaworld/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:335:12)
at next (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:275:10)
at /Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:635:15
app.js
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(expressValidator()); // Add this after the bodyParser middlewares!
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
app.use('/catalog', catalog); // Add catalog routes to middleware chain.
在我的一个控制器中,我使用 isDate() 方法对我在 AuthorSchema 中单独定义的日期进行一些验证。
var AuthorSchema = Schema( {
first_name: {type: String, required: true, max: 100},
family_name: {type: String, required: true, max: 100},
date_of_birth: {type: Date},
date_of_death: {type: Date},
} );
现在要处理 post 请求,我在控制器中有以下代码:
authorController.js -- 来自第 41-48 行的行
// Handle Author create on POST
exports.author_create_post = function(req, res, next) {
console.log("DEBUG: starting in exports.author_create_post");
req.checkBody('first_name', 'First name must be specified.').notEmpty();
req.checkBody('family_name', 'Family name must be specified.').notEmpty();
req.checkBody('family_name', 'Family name must be alphanumeric text.').isAlpha();
req.checkBody('date_of_birth', 'Invalid date').optional({ checkFalsy: true }).isDate(); // Error is on this usage of isDate()
req.checkBody('date_of_death', 'Invalid date').optional({ checkFalsy: true }).isDate();
isDate()
已从 validator.js 中删除。您可以在 GitHub 上查看 this 提交以获取更多信息。 express-validator 使用 validator.js 进行验证。
您可以制作自定义验证器来检查有效日期。对于新的 API:
check('date').custom(isValidDate).withMessage('the date must be valid');
为了遗产API:
app.use(expressValidator({
customValidators: {
isValidDate: isValidDate
}
}));
当您应用中间件(在 app.js 或类似的东西中)并进行检查时:
req.checkBody('date', 'the date must be valid').isValidDate();
isValidDate()
得自己写。这是一个例子:
function isValidDate(value) {
if (!value.match(/^\d{4}-\d{2}-\d{2}$/)) return false;
const date = new Date(value);
if (!date.getTime()) return false;
return date.toISOString().slice(0, 10) === value;
}
这会检查 yyyy-mm-dd 格式的日期。它取自 this 答案。 Stack Overflow 上还有许多针对不同格式的其他答案:
- mm/dd/yyyy
- dd/mm/yyyy
或者使用瞬间的isValid().
我在使用 express 验证器时遇到问题,特别是 isDate 函数。我已经采取措施使用 expressvalidator、bodyparse、validator 模块等。所有路由仅在此之后.. 环境是 Node + Express。
问题出在
的用法上"req.checkBody('date_of_birth', 'Invalid date').optional({ checkFalsy: true }).isDate();"
我不断收到以下 错误。
TypeError: req.checkBody(...).optional(...).isDate is not a function
at exports.author_create_post (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/controllers/authorController.js:47:81)
at Layer.handle [as handle_request] (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/layer.js:95:5)
at next (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/route.js:137:13)
at Route.dispatch (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/route.js:112:3)
at Layer.handle [as handle_request] (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/layer.js:95:5)
at /Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:281:22
at Function.process_params (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:335:12)
at next (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:275:10)
at Function.handle (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:174:3)
at router (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:47:12)
at Layer.handle [as handle_request] (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/layer.js:95:5)
at trim_prefix (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:317:13)
at /Users/svitaworld/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:284:7
at Function.process_params (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:335:12)
at next (/Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:275:10)
at /Users/mycomputer/Desktop/NodeJS/express-locallibrary-tutorial/node_modules/express/lib/router/index.js:635:15
app.js
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: false
}));
app.use(expressValidator()); // Add this after the bodyParser middlewares!
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));
app.use('/', index);
app.use('/users', users);
app.use('/catalog', catalog); // Add catalog routes to middleware chain.
在我的一个控制器中,我使用 isDate() 方法对我在 AuthorSchema 中单独定义的日期进行一些验证。
var AuthorSchema = Schema( {
first_name: {type: String, required: true, max: 100},
family_name: {type: String, required: true, max: 100},
date_of_birth: {type: Date},
date_of_death: {type: Date},
} );
现在要处理 post 请求,我在控制器中有以下代码:
authorController.js -- 来自第 41-48 行的行
// Handle Author create on POST
exports.author_create_post = function(req, res, next) {
console.log("DEBUG: starting in exports.author_create_post");
req.checkBody('first_name', 'First name must be specified.').notEmpty();
req.checkBody('family_name', 'Family name must be specified.').notEmpty();
req.checkBody('family_name', 'Family name must be alphanumeric text.').isAlpha();
req.checkBody('date_of_birth', 'Invalid date').optional({ checkFalsy: true }).isDate(); // Error is on this usage of isDate()
req.checkBody('date_of_death', 'Invalid date').optional({ checkFalsy: true }).isDate();
isDate()
已从 validator.js 中删除。您可以在 GitHub 上查看 this 提交以获取更多信息。 express-validator 使用 validator.js 进行验证。
您可以制作自定义验证器来检查有效日期。对于新的 API:
check('date').custom(isValidDate).withMessage('the date must be valid');
为了遗产API:
app.use(expressValidator({
customValidators: {
isValidDate: isValidDate
}
}));
当您应用中间件(在 app.js 或类似的东西中)并进行检查时:
req.checkBody('date', 'the date must be valid').isValidDate();
isValidDate()
得自己写。这是一个例子:
function isValidDate(value) {
if (!value.match(/^\d{4}-\d{2}-\d{2}$/)) return false;
const date = new Date(value);
if (!date.getTime()) return false;
return date.toISOString().slice(0, 10) === value;
}
这会检查 yyyy-mm-dd 格式的日期。它取自 this 答案。 Stack Overflow 上还有许多针对不同格式的其他答案:
- mm/dd/yyyy
- dd/mm/yyyy
或者使用瞬间的isValid().