首页 > 解决方案 > 创建 HAPI 路由先决条件以从 REST API 中获取一些价值

问题描述

如何创建路由先决条件以从 REST API 中获取一些价值?如何实现getCount函数等待 API 响应并在路由处理函数中使用它?(请注意,我使用的是 Hapi 8.3.1)

server.route({
    method: 'GET',
    path: '/products',
    config: {
        state: {
            failAction: 'ignore'
        },
        pre:[{method:getCount, assign: 'count'}],
        handler: function (request, reply) {

            console.log(request.pre.count);

            reply({products}).code(200);
        }
    }
});

function getCount(request, reply){
    http.get('/products/count/')
    // how to implement this to wait till get product count;
}

标签: node.jshapijs

解决方案


您似乎想在代码继续之前等待 HTTP 请求完成?在这种情况下,您需要将 getCount 设为异步函数,并等待获取请求。您还应该使用 fetch() 而不是 http.get()。所以,你最终会得到这个:

server.route({
    method: 'GET',
    path: '/products',
    config: {
        state: {
            failAction: 'ignore'
        },
        pre:[{method:getCount, assign: 'count'}],
        handler: function (request, reply) {

            console.log(request.pre.count);

            reply({products}).code(200);
        }
    }
});

async function getCount(request, reply){
    let count = await fetch('/products/count/');
    return count;
}

这将在返回值之前等待请求完成。如果您的节点版本不支持异步/等待,也可以使用 .then() 和 Promises 来执行此操作。使用它会产生如下代码:

server.route({
    method: 'GET',
    path: '/products',
    config: {
        state: {
            failAction: 'ignore'
        },
        pre:[{method:getCount, assign: 'count'}],
        handler: function (request, reply) {

            console.log(request.pre.count);

            reply({products}).code(200);
        }
    }
});

function getCount(request, reply){
    return new Promise(function (resolve, reject) {
      fetch('/products/count/').then(function(result) {
        resolve(result); 
      }).catch(function (err) {
        reject(err);
      });
    });
}

推荐阅读