Search code examples
resthapi.jshapi-swagger

rest-hapi standalone endpoint not returning handler results


Forgive me if it's a silly question, but the last time I coded in javascript was almost 20 years ago... I'm re-learning javascript these weeks and I'm not sure I got it all.

I'm using hapi with rest-hapi and want to add some standalone endpoints, basically translating the backend portion of this Autodesk tutorial form express.

I'm using the basic rest-hapi example main script, and tried to add a route with the following code:

//api/forge.js
module.exports = function(server, mongoose, logger) {
  const Axios = require('axios')
  const querystring = require('querystring')
  const Boom = require('boom')

  const FORGE_CLIENT_ID = process.env.FORGE_CLIENT_ID
  const FORGE_CLIENT_SECRET = process.env.FORGE_CLIENT_SECRET
  const AUTH_URL = 'https://developer.api.autodesk.com/authentication/v1/authenticate'

  const oauthPublicHandler = async(request, h) => {
    const Log = logger.bind('User Token')
    try {
      const response = await Axios({
        method: 'POST',
        url: AUTH_URL,
        headers: {
          'content-type': 'application/x-www-form-urlencoded',
        },
        data: querystring.stringify({
          client_id: FORGE_CLIENT_ID,
          client_secret: FORGE_CLIENT_SECRET,
          grant_type: 'client_credentials',
          scope: 'viewables:read'
        })
      })
      Log.note('Forge access token retrieved: ' + response.data.access_token)
      return h.response(response.data).code(200)
    } catch(err) {
      if (!err.isBoom){
        Log.error(err)
        throw Boom.badImplementation(err)
      } else {
        throw err
      }
    }
  }

  server.route({
    method: 'GET',
    path: '/api/forge/oauth/public',
    options: {
      handler: oauthPublicHandler,
      tags: [ 'api' ],
      plugins: {
        'hapi-swagger': {}
      }
    }
  })
}

The code works and I can display the access_token in nodejs console, but swagger doesn't get the response:

swagger result

At first I thought that an async function cannot be used as handler, but my hapi version is 17.4.0, and it supports async handlers.

What am I doing wrong?


Solution

  • It turns out it was an easy fix: I just needed to specify the Hapi server hostname in my main script!

    The problem was with CORS, since Hapi used my machine name instead of localhost. Using

    let server = Hapi.Server({
      port: 8080,
      host: 'localhost'
    })
    

    solved my problem.