Search code examples
javascripthtmlnode.jsibm-cloudibm-watson

How do I connect service to a Cloud Foundry app?


I'm new to IBM cloud and I'm trying to build an application where I can write a text, press a button and that text is analysed by the service tone analyser returning a JSON so I can show it.

I have created an instance of said service and I have connected it to my application (a toolchain) using the 'connections' tab on the service. enter image description here

I also have this code on the app.js file on my app:

const ToneAnalyzerV3 = require('ibm-watson/tone-analyzer/v3');
const { IamAuthenticator } = require('ibm-watson/auth');

const toneAnalyzer = new ToneAnalyzerV3({
  version: '2019-10-10',
  authenticator: new IamAuthenticator({
    apikey: [API key found in service credentials],
  }),
  url: [API url found in service credentials],
});

app.get('/', function(req, res) {
  res.render('index');
});

app.post('/api/tone', async function(req, res, next) {
  try {
    const { result } = await toneAnalyzer.tone(req.body);
    res.json(result);
  } catch (error) {
    next(error);
  }
});

The problem is that when I make the following call on my javascript:

$.post( "/api/tone", {text: textInput}, function(data){
        console.log(data);
    });

I get the error: 500 (Internal Server Error).

Does anybody know what I am doing wrong?


Solution

  • The issue is that you are sending req.body to be analysed for tone. If you take a look at the API Docs - https://cloud.ibm.com/apidocs/tone-analyzer?code=node#tone - you will see that you only need to send

    const toneParams = {
      toneInput: { 'text': text },
      contentType: 'application/json',
    };
    

    I doubt very much that req.body has a toneInput field, and if it does have contentType it may not be set to one of the allowable values.