Search code examples
mongodbexpressmongooseecmascript-6es6-promise

ES6 Promises in express app not properly resolving data


I'm writing an a async function with ES6 promises, that 1) saves the query parameters for a user 2) fetches data from mongodb using mongoose, 3) manipulates the json into a DSL, 4) and queries another db with it. mongoose": "^4.7.7"

//myController.js    
const myQuery = require('../models/myQuery_model');
require('mongoose').Promise = global.Promise
const uuidV4 = require('uuid/v4');


exports.saveNewQuery = function(req, res, next) {

  const rawQuery = req.body;
  const queryToStore = new myQuery(rawQuery);
  const uid = uuidV4();
  const queryToStore.uid = uid

  queryToStore.save().then(() => {
      fetchQueryFromMongo(uid);

    }).then((storedQuery) => {
      compileQueryToString(storedQuery);

    }).then((queryString) => {
      fetchResultsFromOtherDb(queryString);

    }).then((results) => {
      res.json({ results });

    }).catch((error) => {

      console.log(error)
    })
  }

Currently I'm not able to resolve the response from mongodb step 2. Still, the controllter goes on to compileQueryToString rather than catch the error from fetchQueryFromMongo

// fetchQueryFromMongo.js
const myQuery = require('../models/myQuery');
require('mongoose').Promise = global.Promise

module.exports = (uid) => {
  return new Promise(
    (resolve, reject) => {
      myQuery.find({ uid }).then((err, res) => {

        if (err) {
          reject(err);
        }
        console.log('response success!')
        resolve(res);
      });
    }
  );
};

I'm new to promises so any tips / suggestions would be appreciated!


Solution

  • Make sure to return a value from your then handlers. The code below does this by using the concise body form of arrow functions.

    queryToStore.save()
      .then(()          => fetchQueryFromMongo(uid))
      .then(storedQuery => compileQueryToString(storedQuery))
      .then(queryString => fetchResultsFromOtherDb(queryString))
      .then(results     => res.json({ results }))
      .catch(console.log);