承诺去节点化 Joi.validate
Promise denodeify Joi.validate
我有一个关于 denodeify 和 promises 的问题。我有一些代码(如下所示);我正在使用 Promise@7.0.1,我只想去节点化 Joi.validate。如果我做类似
的事情
var jv = Promise.denodeify(Joi.validate);
return jv(Qs.parse(request.query), joiSchema).then(function(value) {
console.log("value = " + JSON.stringify(value));
return reply("OK").code(200);
});
我给了它有效的查询字符串参数(见下面的代码),它按预期工作。但是,如果我将 rowCount 设为 30,它就会挂起。我不能在我的 then() 中使用 function(err,value),那么如何在承诺链中处理 Joi 验证 errors/messages?这可能吗?
下面是没有 denodeify 的代码:
(function() {
var Hapi = require("hapi");
var Boom = require("boom");
var Qs = require("qs");
var Joi = require("joi");
var Promise = require("promise");
var hostName = "SEMrush";
var hostPort = 4355;
// Create a server with a host and port
var server = new Hapi.Server();
server.connection({
host: "localhost",
port: hostPort
});
server.route({
method: "GET",
path: "/joiTest",
handler: function(request, reply) {
var joiSchema = Joi.object().keys({
phrase: Joi.string().alphanum().required(),
rowCount: Joi.number().integer().min(1).max(20)
});
Joi.validate(Qs.parse(request.query), joiSchema, function(err, value) {
if (err) {
console.log("err = " + err);
return reply(Boom.badRequest(err.message));
} else {
console.log("value = " + value);
return reply("OK").code(200);
}
});
}
});
// Default catch-all route.
server.route({
method: '*',
path: '/{p*}',
handler: function(request, reply) {
return reply("The requested resource was not found.").code(404);
}
});
server.start(function() {
console.log("\r\nService started on port " + hostPort);
});
})();
how can validation errors/messages be handled in a promise chain? Is this possible?
是的,then
确实对错误情况进行了(可选的)第二次回调。它会在 promise 被拒绝时调用,如果没有给出回调,错误只会在链中冒泡。
要复制原始代码的行为,您需要使用
var jv = Promise.denodeify(Joi.validate);
return jv(Qs.parse(request.query), joiSchema).then(function(value) {
console.log("value = " + JSON.stringify(value));
return reply("OK").code(200);
}, function(err) {
console.log("err = " + err);
return reply(Boom.badRequest(err.message));
});
我有一个关于 denodeify 和 promises 的问题。我有一些代码(如下所示);我正在使用 Promise@7.0.1,我只想去节点化 Joi.validate。如果我做类似
的事情var jv = Promise.denodeify(Joi.validate);
return jv(Qs.parse(request.query), joiSchema).then(function(value) {
console.log("value = " + JSON.stringify(value));
return reply("OK").code(200);
});
我给了它有效的查询字符串参数(见下面的代码),它按预期工作。但是,如果我将 rowCount 设为 30,它就会挂起。我不能在我的 then() 中使用 function(err,value),那么如何在承诺链中处理 Joi 验证 errors/messages?这可能吗?
下面是没有 denodeify 的代码:
(function() {
var Hapi = require("hapi");
var Boom = require("boom");
var Qs = require("qs");
var Joi = require("joi");
var Promise = require("promise");
var hostName = "SEMrush";
var hostPort = 4355;
// Create a server with a host and port
var server = new Hapi.Server();
server.connection({
host: "localhost",
port: hostPort
});
server.route({
method: "GET",
path: "/joiTest",
handler: function(request, reply) {
var joiSchema = Joi.object().keys({
phrase: Joi.string().alphanum().required(),
rowCount: Joi.number().integer().min(1).max(20)
});
Joi.validate(Qs.parse(request.query), joiSchema, function(err, value) {
if (err) {
console.log("err = " + err);
return reply(Boom.badRequest(err.message));
} else {
console.log("value = " + value);
return reply("OK").code(200);
}
});
}
});
// Default catch-all route.
server.route({
method: '*',
path: '/{p*}',
handler: function(request, reply) {
return reply("The requested resource was not found.").code(404);
}
});
server.start(function() {
console.log("\r\nService started on port " + hostPort);
});
})();
how can validation errors/messages be handled in a promise chain? Is this possible?
是的,then
确实对错误情况进行了(可选的)第二次回调。它会在 promise 被拒绝时调用,如果没有给出回调,错误只会在链中冒泡。
要复制原始代码的行为,您需要使用
var jv = Promise.denodeify(Joi.validate);
return jv(Qs.parse(request.query), joiSchema).then(function(value) {
console.log("value = " + JSON.stringify(value));
return reply("OK").code(200);
}, function(err) {
console.log("err = " + err);
return reply(Boom.badRequest(err.message));
});