Search code examples
hapi.js

Delay Response with Hapi 18.1


How can I set a delay in response using Hapi 18.1, I want to see hour glass spinning if API response is slow. With earlier versions I used setTimeout() like below.

server.route({
    method: 'GET',
    path:'/hello',
    handler: (request, h) => {
       setTimeout(() => reply('Hello World!'), 1000);
    }
});

But v18.1 is throwing an error

server.route({
    method: 'GET',
    path:'/hello',
    handler: (request, h) => {
       setTimeout(() => h.response('Hello World!'), 1000);
    }
});

Error

Debug: internal, implementation, error
    Error: get method did not return a value, a promise, or throw an error
    at module.exports.internals.Manager.execute (C:\Users\javakb\workspace\node_modules\hapi\lib\toolkit.js:48:29)
    at processTicksAndRejections (internal/process/task_queues.js:85:5)
    at async Object.internals.handler (C:\Users\javakb\workspace\node_modules\hapi\lib\handler.js:46:20)
    at async exports.execute (C:\Users\javakb\workspace\node_modules\hapi\lib\handler.js:31:20)
    at async Request._lifecycle (C:\Users\javakb\workspace\node_modules\hapi\lib\request.js:312:32)
    at async Request._execute (C:\Users\javakb\workspace\node_modules\hapi\lib\request.js:221:9)

Any help is appreciated.


Solution

  • Hapi 18 expects it's route handlers to return the response or a promise that resolves to a response. Your code isn't doing that. This can be fixed by simply returning a promise that resolves to the response after waiting 1 second.

    Example

    server.route({
        method: 'GET',
        path: '/',
        handler: (request, h) => {
          return new Promise((resolve, reject) => {
            setTimeout(() => {
              resolve(h.response('Hello World!'));
            }, 1000);
          });
        }
      });