我有这个joi模式来验证通过body作为json发送的电子邮件和密码。另外,我现在要检查IP地址。我像下面尝试过,但是我得到了:
{
"isJoi": true,
"name": "ValidationError",
"details": [
{
"message": "\"ip\" is required",
"path": [
"ip"
],
"type": "any.required",
"context": {
"key": "ip",
"label": "ip"
}
}
],
"_object": {
"email": "loremlipsum02@abc.at",
"password": "kyuser2923?"
}
}
这是我在routehelpers.js中的joi模式
const Joi = require('joi');
module.exports = {
validateSignup: (schema) => {
return (req, res, next) => {
const result = Joi.validate(req.body, schema);
if (result.error) {
return res.status(400).json(result.error);
}
if (!req.value) { req.value = {}; }
req.value['body']= result.value;
next();
}
},
schemas: {
signupSchema: Joi.object().keys({
email: Joi.string().email().required(),
password: Joi.string().required(),
ip: Joi.string().ip({
version: [
'ipv4',
'ipv6'
],
cidr: 'required'
}).required()
})
}
}
当我插入控制器时:
const curIP = req.ip;
console.log('IP: '+curIP);
我确实在控制台中获得了IP:
Server running at http://127.0.0.1:4002/
IP: 127.0.0.1
但是我还可以如何从请求注册的服务器上验证IP?
我想是因为它正在检查req.value.body中的所有内容。但是我该如何更改validateSignup:(schema)来检查请求注册的ip?
答案 0 :(得分:1)
看起来您正在尝试匹配ip
对象中的body
中的req
属性。
尝试:
const result = Joi.validate(Object.assign(req.body, { ip: req.ip }), schema);
尽管我认为更好的方法是使用proxy-addr之类的库。即使服务器在反向代理后面运行,这也将提取正确的客户端IP。