- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
Hapi.js Validation with Joi + failAction
问题。
我们想构建一个“传统”服务器端-仅使用 Hapi 呈现应用程序。
我正在尝试理解如何避免返回“raw”400
Joi
验证失败时给客户端的错误:
我们要拦截这个“email not allowed to be empty”validation error,并在html模板中显示给客户端,而不是简单地返回 400
错误。
@AdriVanHoudt建议我们应该:
"Look at failAction under http://hapijs.com/api#route-options "
因此我们将 failAction: 'log'
添加到 /register
路由处理程序中:
{
method: '*',
path: '/register',
config: {
validate: {
payload : register_fields,
failAction: 'log'
}
},
handler: register_handler
}
查看代码: server.js
register_handler
是:
function register_handler(request, reply, source, error) {
console.log(request.payload);
console.log(' - - - - - - - - - - - - - - - - - - - - -');
console.log(source)
console.log(' - - - - - - - - - - - - - - - - - - - - -');
console.log(error)
return reply('welcome!');
}
我期待在终端/控制台中看到一个错误但是当我尝试 console.log
handler
时:
- - - - - - - - - - - - - - - - - - - - -
undefined
- - - - - - - - - - - - - - - - - - - - -
undefined
我在 GitHub 上问了这个问题:https://github.com/hapijs/joi/issues/725但还没有得到一个好的例子的答案。如果您有时间提供帮助,请提供完整代码:https://github.com/nelsonic/hapi-validation-question
最佳答案
server.ext('onPreResponse' ...
正如@Clarkie 所指出的,在您的 Hapi 应用程序中捕获所有错误的通用方法是使用'onPreResponse'
。
我们写了一个 Hapi 插件来做这件事:https://www.npmjs.com/package/hapi-error
像往常一样:
并让您通过 3 个简单的步骤定义自己的自定义错误页面。
npm install hapi-error --save
在您注册
您的服务器时包含插件:
See: /example/server_example.js for simple example
error_template
Note:
hapi-error
plugin expects you are usingVision
(the standard view rendering library for Hapi apps) which allows you to use Handlebars, Jade, React, etc. for your templates.
您的 error_template.html
(或 error_template.ext
error_template.jsx
)应该使用 3它将被传递的变量:
errorTitle
- Hapi 生成的错误磁贴statusCode
- *HTTP statusCode 发送到客户端例如:404
(未找到)errorMessage
- 人性化的错误消息for an example see:
/example/error_template.html
就是这样!
failAction
我们添加了 failAction
,它重新使用 register_handler
以便 registration-form.html
显示任何输入验证错误消息(直到提交有效数据)
{
method: '*',
path: '/register',
config: {
validate: {
payload : register_fields,
failAction: register_handler // register_handler is dual-purpose (see below!)
}
},
handler: register_handler
}
register_handler
是:
function register_handler(request, reply, source, error) {
// show the registration form until its submitted correctly
if(!request.payload || request.payload && error) {
var errors, values; // return empty if not set.
if(error && error.data) { // means the handler is dual-purpose
errors = extract_validation_error(error); // the error field + message
values = return_form_input_values(error); // avoid wiping form data
}
return reply.view('registration-form', {
title : 'Please Register ' + request.server.version,
error : errors, // error object used in html template
values : values // (escaped) values displayed in form inputs
}).code(error ? 400 : 200); // HTTP status code depending on error
}
else { // once successful, show welcome message!
return reply.view('welcome-message', {
name : validator.escape(request.payload.name),
email : validator.escape(request.payload.email)
})
}
}
See: server.js:57 for complete file.
其中 extract_validation_error(error)
和 return_form_input_values(error)
是在 server.js
中定义的辅助函数(但会被拆分成可重复使用的 View 辅助函数),这使我们的处理函数保持精简。
当我们提交没有任何必填字段的表单时,我们会看到:
我们还使用 https://github.com/chriso/validator.js减轻Cross Site Scripting漏洞:
并在成功注册时显示欢迎信息:
我们觉得重新使用处理函数作为 failAction
将与此路线/操作相关的代码保存在一个地方而 server.ext('onPreResponse' ...
(虽然适合初始检查)将引入“hooks”这可能会造成混淆(一旦一个应用程序有很多这样的钩子(Hook)...)
关于javascript - 使用 Joi 验证请求时如何避免 Hapi.js 发送 400 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32897719/
在 JSF2 应用程序中遇到验证属性的问题时,有两种主要方法。 使用 Annotation 在 ManagedBean 上定义验证 @ManagedBean public class MyBean {
我想实现一个不常见的功能,我认为 jquery 验证插件将是最好的方法(如果您在没有插件的情况下建议和回答,我们也会欢迎)。我想在用户在输入字段中输入正确的单词后立即隐藏表单。我试过这个: $("
我有几个下拉菜单(类名为month_dropdown),并且下拉菜单的数量不是恒定的。我怎样才能为它们实现 NotEqual 验证。我正在使用 jQuery 验证插件。 这就是我写的 - jQuery
我设法制作了这个网址验证代码并且它起作用了。但我面临着一个问题。我认为 stackoverflow 是获得解决方案的最佳场所。 function url_followers(){ var url=do
我目前正在使用后端服务,该服务允许用户在客户端应用程序上使用 Google Games 库登录。 用户可以通过他们的 gplay ID 向我们发送信息,以便登录或恢复旧帐户。用户向我们发送以下内容,包
我正在尝试验证输入以查看它是否是有效的 IP 地址(可能是部分地址)。 可接受的输入:172、172.112、172.112.113、172.112.113.114 Not Acceptable 输入
我从 Mongoose 验证中得到这条消息: 'Validator failed for path phone with value ``' 这不应该发生,因为不需要电话。 这是我的模型架构: var
我一直在尝试使用Python-LDAP (版本 2.4.19)在 MacOS X 10.9.5 和 Python 2.7.9 下 我想在调用 .start_tls_s() 后验证与给定 LDAP 服务
我正在处理一个仅与 IE6 兼容的旧 javascript 项目(抱歉...),我想仅在 VS 2017 中禁用此项目的 ESLint/CSLint/Javascript 验证/CSS 验证。 我知道
我正在寻找一种方法来验证 Spring 命令 bean 中的 java.lang.Double 字段的最大值和最小值(一个值必须位于给定的值范围之间),例如, public final class W
我正在尝试在 springfuse(JavaEE 6 + Spring Framework (针对 Jetty、Tomcat、JBoss 等)) 和 maven 的帮助下构建我的 webapps 工作
我试图在我们的项目中使用 scalaz 验证,但遇到了以下情况: def rate(username: String, params: Map[String, String]): Validation
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
我有一个表单,人们可以单击并向表单添加字段,并且我需要让它在单击时验证这些字段中的值。 假设我单击它两次并获取 2 个独立的字段集,我需要旋转 % 以确保它在保存时等于 100。 我已放入此函数以使其
在我的页面中有一个选项可以创建新的日期字段输入框。用户可以根据需要创建尽可能多的“截止日期”和“起始日期”框。就像, 日期_to1 || date_from1 日期到2 ||日期_from2 date
我有一个像这样的 Yaml 文件 name: hhh_aaa_bbb arguments: - !argument name: inputsss des
有没有办法在动态字段上使用 jquery 验证表单。 我想将其设置为必填字段 我正在使用 Jsp 动态创建表单字段。 喜欢 等等...... 我想使用必需的表单字段验证此表单字段。 最佳答
嗨,任何人都可以通过提供 JavaScript 代码来帮助我验证用户名文本框不应包含数字,它只能包含一个字符。 最佳答案 使用正则表达式: (\d)+ 如果找到匹配项,则字符串中就有一个数字。 关于J
我有两个输入字段holidayDate和Description(id=tags) $(document).ready(function() {
我遇到了这个问题,这些验证从电子邮件验证部分开始就停止工作。 我只是不明白为什么即使经过几天的观察,只是想知道是否有人可以在这里指出我的错误? Javascript部分: function valid
我是一名优秀的程序员,十分优秀!