Next.js с Мангустом — Есть ли центральное место для инициирования соединения?

#node.js #mongoose #next.js

#node.js #mongoose #next.js

Вопрос:

Я рассмотрел пример создания приложения с Next.js и Мангуст здесь: https://github.com/vercel/next.js/tree/canary/examples/with-mongodb-mongoose

В этом примере они создали функцию, которая устанавливает соединение с базой данных, а также кэширует ее для горячих перезагрузок. Они помещают его в файл под названием dbConnect.js :

 let cached = global.mongoose

if (!cached) {
  cached = global.mongoose = { conn: null, promise: null }
}

async function dbConnect() {
  if (cached.conn) {
    return cached.conn
  }

  if (!cached.promise) {
    const opts = {
      bufferCommands: false,
    }

    cached.promise = mongoose.connect(MONGODB_URI, opts).then((mongoose) => {
      return mongoose
    })
  }
  cached.conn = await cached.promise
  return cached.conn
}

export default dbConnect 

Затем на каждой странице, отображаемой на стороне сервера, они импортировали dbConnect функцию, а в getServerSideProps функции вызывали ее. Например, страница, которая извлекает только один элемент из базы данных, имеет следующий вызов:

 export async function getServerSideProps({ params }) {
  await dbConnect()

  const pet = await Pet.findById(params.id).lean()
  pet._id = pet._id.toString()

  return { props: { pet } }
} 

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

Я попытался вызвать его, _app.tsx но это полностью сломало все приложение. Я не хочу использовать эту getInitialProps функцию, потому что в моем приложении есть несколько статических страниц, и, насколько я понимаю, использование этой функции приведет к тому, что все страницы будут отображаться на стороне сервера. Есть ли какой-либо другой способ инициировать соединение при запуске сервера?

Комментарии:

1. getInitialProps не заставит ваши страницы отображаться на сервере. Вы все равно можете статически генерировать страницы с export помощью функции.

2. Вы всегда можете абстрагировать то, что вам нужно было бы добавить в свою getInitialProps функцию, в другую функцию и импортировать это на каждую страницу. В конце концов, каждая страница нуждается в этой функции для последующей работы.

3. ОК. Итак, когда вы говорите «функция экспорта», вы имеете в виду статический экспорт HTML ( nextjs.org/docs/advanced-features/static-html-export )? Могу ли я использовать эту функцию для экспорта только выбранных страниц, в то время как все остальные отображаются на сервере? Спасибо

4. Я думаю, вы не понимаете, что делают эти две вещи. Экспорт экспортирует статические HTML-файлы … всего веб-сайта, который getStaticPaths определил. SSR dos все то же самое, но на лету во время кэширования… итак, обычный SSR — это то, что, похоже, вы ищете

5. О, хорошо. Я снова прочитал документы после вашего комментария, и, думаю, теперь я понял. getInitialProps отключает только автоматическую статическую оптимизацию. Я думал, что это полностью отключает генерацию статических страниц. Думаю, теперь я понял. Спасибо за вашу помощь.