Создание API с помощью redis и hapi - PullRequest
0 голосов
/ 05 августа 2020

Я пытаюсь отправить результаты get from redis через hapi, но я продолжаю получать 500. Как я могу отправить результат get от redis клиенту? Код и ошибка ниже.

Ошибка

Отладка: внутренняя, реализация, ошибка

Ошибка: метод обработчика не вернул значение, обещание, или выдать ошибку

{
    statusCode: 500,
    error: "Internal Server Error",
    message: "An internal server error occurred"
}

Код

'use strict';
const Hapi = require('@hapi/hapi');
const redis = require("redis");
const client = redis.createClient();

client.on("error", function (error) {
  console.error(error);
});

const init = async () => {

  const server = Hapi.server({
    port: 3001,
    host: 'localhost'
  });

  server.route({
    method: 'GET',
    path: '/api/v1/key/{id}',
    handler: (request, h) => {
      client.get(request.params.id, (err, res) => {
        if (err) {
          h.response(err)
        } else {
          h.response(res)
        }
      });
    }
  });

  await server.start();
  console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {

  console.log(err);
  process.exit(1);
});

init();

1 Ответ

0 голосов
/ 05 августа 2020

Я разобрался. Вы можете преобразовать модуль redis в обещание и вернуть оттуда значения.

'use strict';
const Hapi = require('@hapi/hapi');
const redis = require('redis');
const client = redis.createClient();
const { promisify } = require("util");
const getAsync = promisify(client.get).bind(client);
const setAsync = promisify(client.set).bind(client);

client.on("error", function (error) {
    console.error(error);
});

const init = async () => {

    const server = Hapi.server({
        port: 5000,
        host: 'localhost'
    });

    server.route({
        method: 'GET',
        path: '/api/v1/key/{id}',
        handler: (req, h) => {
            return getAsync(req.params.id).then(res => {
                console.log(res)
                return res
            }).catch(err => {
                console.error(err)
                return err
            });
        }

    })

    server.route({
        method: 'post',
        path: '/api/v1/key',
        handler: (req, h) => {
            return setAsync(req.payload.hash, req.payload.key).then(res => {
                console.log(res)
                return res
            }).catch(err => {
                console.error(err)
                return err
            })
        }

    })

    await server.start();
    console.log('Server running on %s', server.info.uri);
};

process.on('unhandledRejection', (err) => {

    console.log(err);
    process.exit(1);
});

init();
...