Simple fetch from API in Nodejs but UnhandledPromiseRejectionWarning: nestedFunction is not a Function

Viewed 74

I'm a non-professional using nodejs server (backend) and javascript/html (frontend) to fetch data from two API's: one API gives a response and I use an ID from the first API to fetch data from the other API. The API returns XML so I use XML2Json and JSON.parse to get the Javascript Object.

  • everything works perfect until I get to the "return nestedFunction(new_details")-function in the second API-call
  • so this is where the results are sent back to the client
  • I do it for the first API and it works fine (backend + frontend)
  • I tried Async/await but the problem isn't solved
  • I get the error: "UnhandledPromiseRejectionWarning: TypeError: nestedFunction is not a function"

What could be the problem?

app.get('/AATGetTermMatch', function(req,res) {
    let termMatch = req.query.term;
    let termLogop = req.query.logop;
    let termNotes = req.query.notes;
    AATGetTermMatch(termMatch, termLogop, termNotes, function (conceptResults) {
        res.send(conceptResults); 
    });
});
function AATGetTermMatch(termMatch, termLogop, termNotes,  nestedFunction) {
    let URL = baseURL + "AATGetTermMatch?term=" + termMatch + "&logop=" + termLogop + "&notes=" + termNotes;
    fetch(URL)
        .then(function (response){ 
            return response.text(); 
        }).then(function (response) { 
        APICallResults = response;
        parseJson(); 
        let objectAPI = JSON.parse(APICallResults);
        let full_Concepts = objectAPI.Vocabulary.Subject;
        let i;
        for (i = 0; i < full_Concepts.length; i++) {
            global.ID = full_Concepts[i].Subject_ID;
            searchTermDetails(global.ID);
        } return nestedFunction(full_Concepts);
    });
}
app.get('/subjectID', function(req, res) {
    let selectedID = req.query.subjectID;
    searchTermDetails(selectedID, function (termDetails) {
        res.json(termDetails);
    });
});
2nd API : http://vocabsservices.getty.edu/AATService.asmx/AATGetSubject?subjectID=300004838
function searchTermDetails(selectedID, nestedFunction) {
    selectedID = global.ID;
    let URL_Details = baseURL + "AATGetSubject?" + "subjectID=" + selectedID;
    fetch(URL_Details)
        .then(function (response) {
            return response.text();
        }).then(function (response) {
        APICallResults_new = response;
        parseJsonAgain();
        let detailAPI = JSON.parse(APICallResults_new);
        let new_details = detailAPI.Vocabulary.Subject;
        let Subject_ID = new_details[0].Subject_ID;
        let descriptive_Notes_English = new_details[0].Descriptive_Notes[0].Descriptive_Note[0].Note_Text;
        } **return nestedFunction(new_details);**
    }).catch(function (error) {
        console.log("error");
    });
}
function parseJson() {
    xml2js.parseString(APICallResults, {object: true, trim:true, sanitize: true, arrayNotation: true, mergeAttrs: true}, (err, result) => {
        if (err) {
            throw err;
        }
        const resultJson = JSON.stringify(result, null, 4);
        //JSON.parse(resultJson);
        APICallResults = resultJson;
    });
}

function parseJsonAgain() {
    xml2js.parseString(APICallResults_new, {object: true, trim:true, sanitize: true, arrayNotation: true, mergeAttrs: true}, (err, result) => {
        if (err) {
            throw err;
        }
        const resultJsonAgain = JSON.stringify(result, null, 4);
        APICallResults_new = resultJsonAgain;
        //console.log(APICallResults_new);
    });
}

I've read many threads about this error but the proposed solutions don't seem to work.

1 Answers

In here:

   for (i = 0; i < full_Concepts.length; i++) {
        global.ID = full_Concepts[i].Subject_ID;
        searchTermDetails(global.ID);
   }

where you call searchTermDetails(), you are not passing the nestedFunction second argument. Thus, when searchTermDetails() tries to use that argument, it causes the error you get.

You can either add the callback to this call or, if the callback could be optional, then you can modify searchTermDetails to check to see if the second argument is a function and, if not, then don't try to call it.

Related