我想在验证后在我的玉视图中显示我的错误消息。
玉
H1 Hello world
#error
p #{JSON.stringify(errorMsg)}
div
form(action="/",method="post")
div Foo
div
input(type="text",name="foo")
div
input(type="submit",name="submit")
这是我的服务器代码......
server.register(Vision,(err)=>{
if(err){console.log(err)}
server.views({
engines:{
jade:Jade
},
path: 'views',
relativeTo: __dirname });
server.route([
{
method:'GET',path:'/',
handler:(request,reply)=>{
reply.view('index');
}
},
{
method:'POST',path:'/',
handler: (request,reply) => {
console.log("POST '/' ");
const err = {}; // check error and set it
reply.view('index',{errorMsg:err});
},
config:{
validate:{
payload: {
foo: Joi.string().required(),
submit:Joi.string().required()
}
}
}
}
]); });
server.start((err)=>{
if(err){console.log(err);} console.log("server started:"+server.info.uri);
});
目标是验证foo的存在
当验证在服务器响应中踢出一个http 400错误,这个错误完全没问题并且是api的预期。甚至在调用处理函数之前就会发生这种情况。
使用视图引擎处理验证错误的最佳方法是什么?
我期待的东西(显然不起作用)
if(request.error){
reply.view('index',{errorMsg:err});
}
我还看到了一些与onPreResponse
事件相关的答案,以便全局捕获它。是不是他们在请求处理程序方法中执行此操作的方法?
或者任何最佳实践技巧?
答案 0 :(得分:0)
文档具体涵盖了这种情况。查看具体内容here。
直接从文档中获取的简短版本如下所示:
const preResponse = function (request, reply) {
const response = request.response;
if (!response.isBoom) {
return reply.continue();
}
// Replace error with friendly HTML
const error = response;
const ctx = {
message: (error.output.statusCode === 404 ? 'page not found' : 'something went wrong')
};
return reply.view('error', ctx);
};
server.ext('onPreResponse', preResponse);
基本上在preResponse
事件中,检查响应是否为繁荣对象。如果没有,请正常回复。如果是繁荣对象回复您的错误页面并将一些数据传递给它。
答案 1 :(得分:0)
如果使用JOI对象验证有效负载,则无法在处理程序中处理它。
如果您注销请求生命周期:
server.route({
method: 'POST',
path: '/',
handler: (req, reply) => {
reply('hello');
console.log('handler');
},
config: {
validate: {
payload: {
date: Joi.date().required(),
},
},
},
});
server.ext('onRequest', (request, reply) => {
console.log('onRequest');
reply.continue();
});
server.ext('onPreAuth', (request, reply) => {
console.log('onPreAuth');
reply.continue();
});
server.ext('onPostAuth', (request, reply) => {
console.log('onPostAuth');
reply.continue();
});
server.ext('onPreHandler', (request, reply) => {
console.log('onPreHandler');
reply.continue();
});
server.ext('onPostHandler', (request, reply) => {
console.log('onPostHandler');
reply.continue();
});
server.ext('onPreResponse', (request, reply) => {
console.log('onPreResponse');
reply.continue();
});
尝试有效的"日期"你会得到的参数:
onRequest
onPreAuth
onPostAuth
onPreHandler
handler
onPostHandler
onPreResponse
尝试无效参数时,验证失败:
onRequest
onPreAuth
onPostAuth
onPreResponse
正如您所见,根本没有调用处理程序,因此您无法按照描述的方式处理它。
如果您不希望将路由实现为API然后通过您的站点使用它,我建议您从配置中删除validate属性并在您的处理程序中使用Joi.validate(),如下所示: / p>
server.route({
method: 'POST',
path: '/',
handler: (req, reply) => {
Joi.validate(req.payload, dateSchema, (err, val) => {
if (err) {
reply.view('index', { error: err });
}
reply('the date is valid');
});
},
});
请记住,Joi正在抛出error object,所以它不只是文字。