node.jsbackendless

What are Backendless's rules for returning database objects from API Services


I set up a simple Backendless API Service and am running it through CodeRunner. As a test, I'm simply getting a record from the database and returning it. I've tried every combination of return type definition in the class annotations that I can think of, and I've assured that the correct record exists and is being returned to the service, but I've never successfully had the record returned using the console, or via a SDK invocation. In every case, the body returned to the invocation is null. My current test uses "Object" as the return type for the getSchedule call - are database objects not objects?

Here is the entire service:

'use strict';

const { DateTime } = require("luxon");
const util = require("util");

class Scheduling {
     /**
      * 
      * @param {String} day 
      * @returns {Object}
      */
     getSchedule( day ) {
         let t = DateTime.fromISO(day).toMillis();
         let q = Backendless.DataQueryBuilder.create().setWhereClause(`day = ${t}`);

         Backendless.Data.of("schedules").find(q)
         .then(rec => {
             console.log(util.inspect(rec,3))
             if (rec.length === 1) {
                 return rec[0]
             }
             else {
               return {error: 404, msg: 'not found'}
             }
         })
     }
  }
  Backendless.ServerCode.addService( Scheduling )

The "inspect" call indicates I am retrieving the correct record. No errors, the return status of the invocation is always 200. Obviously, I'm missing something about API service return types, please point me in the correct direction.


Solution

  • The problem is the response for the find method is returned after the invocation of getSchedule is complete (because the API invocation is asynchronous).

    How about declaring the getSchedule with async and then await for the API invocation?

    'use strict';
    
    const { DateTime } = require("luxon");
    const util = require("util");
    
    class Scheduling {
         /**
          * 
          * @param {String} day 
          * @returns {Object}
          */
         async getSchedule( day ) {
             let t = DateTime.fromISO(day).toMillis();
             let q = Backendless.DataQueryBuilder.create().setWhereClause(`day = ${t}`);
    
             var rec = await Backendless.Data.of("schedules").find(q);
             
             console.log(util.inspect(rec,3))
             if (rec.length === 1) {
                return rec[0]
             }
             else {
                return {error: 404, msg: 'not found'}
             }
         }
      }
      Backendless.ServerCode.addService( Scheduling )