简体   繁体   中英

atlas mongodb serverless and aws lambda connection issue

I have got a serverless db on atlas ( https://www.mongodb.com/serverless ). I used the connection string recommended by ATLAS:

mongodb+srv://<username>:<password>@xyz.esxbh.mongodb.net/myFirstDatabase?retryWrites=true&w=majority

however as soon as i try to create a record, i get the following error:

{"errorType":"Runtime.UnhandledPromiseRejection","errorMessage":"MongoParseError: Text record must only set `authSource` or `replicaSet`","reason":{"errorType":"MongoParseError","errorMessage":"Text record must only set `authSource` or `replicaSet`","name":"MongoParseError","stack":["MongoParseError: Text record must only set `authSource` or `replicaSet`","

I don't think that the connection string is correct, on the other hand the dns entry for the server does reply with 2 servers.

I tried dropping the '+srv' part, however in that case the save function from mongoose just hangs forever timing out the lambda function.

I could not find any similar problem on google.

The TXT entry record from the dns server shows:

"TXT    "authSource=admin&loadBalanced=true"

How have you configured the serverless database to work?

The code that generates the error depends on mongoose and is as follows:

        try {
          const customer = new Customer(cust);
          console.log('new cusotmer created');
          const returnedCustomer = await customer.save();
          console.log(returnedCustomer);
          return serverResponse(200, returnedCustomer);
        } catch(err){
          console.log(err);
          return errorHandler(500, err)
        }

It seems that the connection to the database is fine:

try {
    await dbTools.connectMongoose();
    console.log('*** connected ***');

} catch(err){
    console.log('error when connecting');
    return errorHandler(500, err);
}

Now, looking at the source code, nothing really too complicated:

if (Object.keys(record).some(key => key !== 'authSource' && key !== 'replicaSet')) {
  return callback(
    new MongoParseError('Text record must only set `authSource` or `replicaSet`')
  );
}

I am now really struggling to understand what's wrong as authSource seems to be present in the TXT record.

Upgrading mongoose to the latest version worked for me in Nodejs .

  1. Remove " mongoose " from package.json.
  2. Reinstall "npm i mongoose"
  3. "mongoose version 6.0.5 " should work.

Worked on 10-Sep-2021

For anyone still experiencing this in 2022, here is an answer from a MongoDB employee (at the bottom). It's a native Node.js driver issue (nothing to do with AWS lambda specifically), which will waterfall to all ODM implementations that implement the native driver.

https://www.mongodb.com/community/forums/t/atlas-serverless-and-dns-txt-record/117967/8

According to Zia Ullah's answer to this same question, this is fixed by Mongoose 6.0.5.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM