MongoError: предпочтение чтения в транзакции должно быть первичным, а не вторичным

avatar
21bn
9 августа 2021 в 06:18
869
2
1

Я пытаюсь установить предпочтение чтения для чтения данных из вторичного хранилища, но это не работает при использовании транзакции в каком-либо API

например, я использую мангуст с узлом js

const mongoose = require("mongoose");
const connect = () => {
mongoose
.connect(mongoURI, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
  useCreateIndex: true,
  readPreference:"secondaryPreferred",
  keepAlive:1,
  replicaSet: "dpx_rs",
  writeConcern:"majority"
  })
.then(() => {
  console.log("MongoDB Connected");
})
.catch((err) => console.log(err));

};

Ответ об ошибке

MongoError: Read preference in a transaction must be primary, 
not: secondaryPreferred
Источник

Ответы (2)

avatar
kij
10 марта 2022 в 08:10
1

При настройке соединения в Mongoose измените свойство readPreference на primary. В настоящее время, как показывает сообщение об ошибке, вы установили secondaryPreferred.

Тогда ваш код должен выглядеть примерно так

const mongoose = require("mongoose");
const connect = () => {
mongoose
.connect(mongoURI, {
  useNewUrlParser: true,
  useUnifiedTopology: true,
  useFindAndModify: false,
  useCreateIndex: true,
  readPreference:"primary",
  keepAlive:1,
  replicaSet: "dpx_rs",
  writeConcern:"majority"
  })
.then(() => {
  console.log("MongoDB Connected");
})
.catch((err) => console.log(err));

Конечно, это если вы хотите, чтобы этот параметр был глобальным и по умолчанию в вашем пуле соединений. Как вы упомянули, при необходимости вы можете переопределить эти настройки для каждого сеанса для конкретных запросов.

avatar
21bn
10 августа 2021 в 03:38
0

У меня есть два условия внутри функции, два из них используют транзакцию, я обнаружил что-то, когда запускаю транзакцию. Я установил предпочтение чтения в параметре сеанса, он работает с первым условием, а второе не знает параметр ключа readPreference

 const opts ={ session, readPreference:"primary" };

Итак, я пытаюсь добавить readPreference только внутри первого условия, оно работает

 opts.readPreference = "primary"

Но если я сделаю это, мне придется найти другую функцию, которая не работает, как я могу установить ее глобально