balderdashy / sails

Realtime MVC Framework for Node.js
https://sailsjs.com
MIT License
22.84k stars 1.95k forks source link

Waterline or sails-mongo does not catch some MongoDB exceptions #7265

Closed anselmo-coolstay closed 1 year ago

anselmo-coolstay commented 1 year ago

Node version: 16.18.1 Sails version (sails): 1.5.2 ORM hook version (sails-hook-orm): 4.0.1 Sockets hook version (sails-hook-sockets): 2.0.1 Organics hook version (sails-hook-organics): N/A Grunt hook version (sails-hook-grunt): 5.0.0 Uploads hook version (sails-hook-uploads): N/A DB adapter & version (e.g. sails-mysql@5.55.5): sails-mongo@2.0.0 Skipper adapter & version (e.g. skipper-s3@5.55.5): N/A


I received the below error message:

You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
AdapterError: Unexpected error from database adapter: not master and slaveOk=false
    at Deferred._.extend._WLModel [as _handleExec] (/home/usera/service-a/source/node_modules/waterline/lib/waterline/methods/update-one.js:161:15)
    at Deferred.exec (/home/usera/service-a/source/node_modules/parley/lib/private/Deferred.js:286:10)
    at Deferred.tryCatcher (/home/usera/service-a/source/node_modules/bluebird/js/release/util.js:11:23)
    at ret (eval at makeNodePromisifiedEval (/home/usera/service-a/source/node_modules/bluebird/js/release/promisify.js:184:12), <anonymous>:14:23)
    at Deferred.toPromise (/home/usera/service-a/source/node_modules/parley/lib/private/Deferred.js:572:19)
    at Deferred.then (/home/usera/service-a/source/node_modules/parley/lib/private/Deferred.js:431:22)
    at runMicrotasks (<anonymous>)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)
You have triggered an unhandledRejection, you may have forgotten to catch a Promise rejection:
AdapterError: Unexpected error from database adapter: Primary stepped down while waiting for replication
    at _afterCounting (/home/usera/service-a/source/node_modules/waterline/lib/waterline/methods/update-one.js:191:17)
    at _afterTalkingToAdapter (/home/usera/service-a/source/node_modules/waterline/lib/waterline/methods/count.js:227:16)
    at Object.success (/home/usera/service-a/source/node_modules/sails-mongo/lib/private/do-with-connection.js:254:18)
    at /home/usera/service-a/source/node_modules/machine/lib/private/help-build-machine.js:1517:30
    at proceedToFinalAfterExecLC (/home/usera/service-a/source/node_modules/parley/lib/private/Deferred.js:1185:16)
    at proceedToInterceptsAndChecks (/home/usera/service-a/source/node_modules/parley/lib/private/Deferred.js:913:12)
    at proceedToAfterExecSpinlocks (/home/usera/service-a/source/node_modules/parley/lib/private/Deferred.js:845:10)
    at /home/usera/service-a/source/node_modules/parley/lib/private/Deferred.js:303:7
    at /home/usera/service-a/source/node_modules/machine/lib/private/help-build-machine.js:954:24
    at Function.handlerCbs.success (/home/usera/service-a/source/node_modules/machine/lib/private/help-build-machine.js:814:26)
    at Object.fn (/home/usera/service-a/source/node_modules/sails-mongo/lib/private/machines/release-connection.js:77:18)
    at wrapper (/home/usera/service-a/source/node_modules/@sailshq/lodash/lib/index.js:3282:19)
    at Deferred.parley.retry [as _handleExec] (/home/usera/service-a/source/node_modules/machine/lib/private/help-build-machine.js:1076:19)
    at Deferred.exec (/home/usera/service-a/source/node_modules/parley/lib/private/Deferred.js:286:10)
    at Deferred.switch (/home/usera/service-a/source/node_modules/machine/lib/private/help-build-machine.js:1469:16)
    at /home/usera/service-a/source/node_modules/sails-mongo/lib/private/do-with-connection.js:242:92

Waterline or sails-mongo seems not to catch this exception. So I should wait timeout in this request. Could you fix it, please?

sailsbot commented 1 year ago

@anselmo-coolstay Thanks for posting! We'll take a look as soon as possible.

In the mean time, there are a few ways you can help speed things along:

Please remember: never post in a public forum if you believe you've found a genuine security vulnerability. Instead, disclose it responsibly.

For help with questions about Sails, click here.

eashaw commented 1 year ago

Hi @anselmo-coolstay, would you be able to share an example of the code where you're seeing this issue?

anselmo-coolstay commented 1 year ago

Sorry, it was my mistake.

My code was like below:

try {
  Inventory.findOrCreate({ date }, inputs).exec(async (err, result, wasCreated) => {
    if (err) {
      ...
    } else if (wasCreated) {
      return exits.success(result);
    }

    return await Inventory.updateOne({ id: result?.id }).set(clonedInputs);
  });
} catch (ex) {
  return exits.error(ex);
}

The above code was wrong.

Try - catch statement should be placed inside of findOrCreate callback function, but I placed it outside of that.