Node.js - Joi 模式:检查 req.value & ip 不工作

Node.js - Joi schema: Check req.value & ip not working

我有这个 joi 模式来验证通过正文作为 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?

您似乎在尝试匹配 body 中的 ip 属性,而它是 req 对象的 属性。

尝试:

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

虽然我认为更好的方法是使用像 proxy-addr 这样的库。即使您的服务器在反向代理后面运行,这也会提取正确的客户端 IP。