#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
отключает только автоматическую статическую оптимизацию. Я думал, что это полностью отключает генерацию статических страниц. Думаю, теперь я понял. Спасибо за вашу помощь.