我将一个对象数组发送到后端,其中每个对象都包含一个服务名称。
[{"serviceName":"service1"},
{"serviceName":"service2"},..]
当我在后端获得数组时,我希望验证数组中的每个对象都具有serviceName属性。
我已经写了下面的代码,但是即使我传递了有效的数组,我还是得到了验证错误。
var Joi = require('joi');
var service = Joi.object().keys({
serviceName: Joi.string().required()
});
var services = Joi.array().ordered(service);
var test = Joi.validate([{serviceName:'service1'},{serviceName:'service2'}],services)
对于上面的代码,我总是得到验证错误消息
"value" at position 1 fails because array must contain at most 1 items
6条答案
按热度按时间wgeznvg71#
将ordered替换为items即可。
如需参考,请单击此处
emeijp432#
下面是一个基本的/更清晰的例子。
下面是Joi验证:
ejk8hzay3#
4ktjp1zp4#
只是想让它更清楚。我目前使用“@hapi/joi:16.1.7”。
假设您希望模式验证这个对象数组。
那么模式的规则应该是:
col17t5w5#
对于Joi,您可以使用下面对我来说很好的方法,这将验证阵列必须至少有一个关键字为serviceName的对象-
zvokhttg6#
像这样的库很棒,但是如果我们能以一种更无缝的方式使用它们,比如在请求管道中,不是更好吗?让我们先看看如何在Node.js的Express应用中使用Joi:
上面的方法是可行的,但是我们必须对每条路线:
1.创建模式
1.调用validate()函数
没有更好的词来形容它,它缺乏优雅。我们想要看起来光滑的东西
构建中间件
让我们看看我们是否可以将其稍微重建为中间件。Express中的中间件只是我们可以在需要时插入请求管道的东西。在我们的例子中,我们希望尝试验证我们的请求,并尽早确定是否值得继续处理或中止它。
让我们来看看中间件。它只是一个函数:
如果我们能够为中间件提供一个模式,那么我们在中间件函数中所要做的就是这样的事情:
我们可以为所有模式创建一个带有工厂函数和模块的模块。让我们先看一下工厂函数模块:
接下来,让我们为所有模式创建一个模块,如下所示:
好了,让我们回到应用程序文件: