Node.js-Joi模式:检查req.value和ip不起作用

时间:2018-08-07 09:47:10

标签: node.js express joi

我有这个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?

1 个答案:

答案 0 :(得分:1)

看起来您正在尝试匹配ip对象中的body中的req属性。

尝试:

const result = Joi.validate(Object.assign(req.body, { ip: req.ip }), schema);

尽管我认为更好的方法是使用proxy-addr之类的库。即使服务器在反向代理后面运行,这也将提取正确的客户端IP。