Node.js Joi阵列验证

Node.js Joi阵列验证,node.js,joi,Node.js,Joi,考虑这个代码片段。我想按1种或多种颜色查询“标记” module.exports = [ { method: 'GET', path: '/search/markers', options: { auth, description: 'Get Markers', notes: 'Returns all marker info', tags: ['

考虑这个代码片段。我想按1种或多种颜色查询“标记”

module.exports = [
    {
        method: 'GET',
        path: '/search/markers',
        options: {
            auth,
            description: 'Get Markers',
            notes: 'Returns all marker info',
            tags: ['api', 'markers'],
            validate: {
                query: {
                    color: Joi.array().items(Joi.string().valid('Red', 'Blue')).single().allow(''),
                }
            },
            response: {
                schema: MarkersValidation.getSearchMarkers
            }
        },
        handler: SearchController.searchMarkers
    }
];

exports.searchMarkers = async (request, h) => {
    try {
        const Markers = h.models().Markers;
        const queryMarkers = Markers.query()
            .select(h.knex().raw([
                'markers.color'
            ]))
            if (request.query.color) {
                queryMarkers.andWhere(h.knex().raw(`color && '{${request.query.color}}'::text[]`));
            }
        }
    }
    catch (e) {
        //error handler
    }
}

然而,当我尝试将颜色的查询参数同时应用于红色和蓝色时,我从Postman那里得到以下错误。应用单色参数时,例如:
Red
,效果良好

错误

子“颜色”失败,因为[颜色”的单个值失败,因为[“颜色”必须是[红色,蓝色]]之一]

URL

{{url}}/search/markers?颜色=红色,蓝色

注意

我尝试删除.single(),但当我删除时,出现以下错误:

子“颜色”失败,因为[“颜色”必须是数组]

问题

我如何解决这个问题

假设我想要一个可用颜色的列表来查询:“绿色”、“紫色”、“黄色”、“红色”、“蓝色”

如何向查询中添加1个或所有选项

示例

{{url}}/search/markers?color=Red

{{url}}/search/markers?颜色=红色、蓝色、黄色

这是我当前的代码,但显然不起作用,有什么想法吗?

const myColors = ['Green', 'Purple', 'Yellow', 'Red', 'Blue'];

validate: {
 query: {
  color: Joi.array().items(Joi.string().valid(myColors)).single().allow(''),
 }
}
更新-简化

在这幅图中,我有一个带有“.valid()”的数组,验证失败

在这幅图中,我有一个没有“.valid()”的数组,验证通过了

我的问题


如何将“.valid()”或类似的内容添加到我的Joi.array中,以便只有我设置的值对此查询有效?

您必须在URL中将颜色查询参数作为数组传递


{{url}/search/markers?color[]=Red&color[]=Blue
您使用的是
express
服务器吗?我使用的是带有PostgresThanks的本地Hapi服务器!请向我显示您的
请求。查询hapi路由中的
对象(使用
JSON.stringify()
)。我的查找单一颜色,如:
{query:{“color”:“red”}
和多种颜色
{query:{“color”:“red,blue”}
。我得到一个字符串而不是数组。即使对于多个值也是如此。您是否使用其他hapi模块或查询解析器?请显示您的设置。我在本地环境中没有
颜色
数组我不确定你想要什么,我想我在上面的细节中添加了所有内容,但以防万一。。。这是有效的:->color:Joi.array().items(Joi.string()).single(),但是当我添加valid时,我得到错误“child”color”失败,因为[“color”必须是[Red,Blue]]中的一个]:->color:Joi.array().items(Joi.string()).single().valid('Red',Blue'),如果我只通过一个项进行查询,添加valid确实有效,因此:对于valid,这是有效的:{url}/search/markers?color=Red带valid,这不起作用,我得到上面提到的错误:{{url}/search/markers?color=Red,Blue为了澄清,我可以简单地使用这个:color:Joi.array().items(Joi.string()).single(),{url}/search/markers?color=Red,Blue,Green--但问题是在我尝试添加.valid()时。我的意图是,您只能通过预定义颜色的集合列表进行查询,但当我添加valid时,会出现上面的错误。color:Joi.array().items(Joi.string()).single().valid('Red','Blue','Green'),{{url}}/search/markers?color=Red,Blue,Green这是绝对必须的吗?如果是,我将如何在后端执行此操作?是的,这是必需的。还编辑了答案以包含后端joi模式。
const myColors = require('../data/colors');

const validateColors = (colors) => {
    if (!colors) {
        return true;
    }
    const colorsArray = colors.split(',');
    const colorsSchema = Joi.array().items(Joi.string().valid(myColors)).allow('')
    return Joi.validate(colorsArray, colorsSchema);
}

query: {colors: Joi.string().allow('')}