1

denodeify と promises について質問があります。いくつかのコードがあります (以下を参照)。私は Promise@7.0.1 を使用しており、Joi.validate を denodeify したかっただけです。私が何かをするなら

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) を使用できないため、Promise チェーンで Joi 検証エラー/メッセージをどのように処理できますか? これは可能ですか?

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);
});
})();
4

1 に答える 1

0

promise チェーンで検証エラー/メッセージをどのように処理できますか? これは可能ですか?

はい、thenエラーの場合に (オプションの) 2 番目のコールバックが必要です。プロミスが拒否されたときに呼び出されます。コールバックが指定されていない場合、エラーはチェーンを通過するだけです。

元のコードの動作を再現するには、次を使用する必要があります

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));
});
于 2015-04-23T14:38:53.207 に答える