Я создаю приложение с Next.js v6 и хочу заполнить страницы результатами из локальной базы данных mongodb.
В идеале я хотел бы сделать что-то столь же простое, как этот пример из учебника , но вместо использования API-выборки, просто отправьте запрос на мой mongodb на localhost.
Пример из учебника Next.js
import Layout from '../components/MyLayout.js'
import Link from 'next/link'
import fetch from 'isomorphic-unfetch'
const Index = (props) => (
<Layout>
<h1>Batman TV Shows</h1>
<ul>
{props.shows.map(({show}) => (
<li key={show.id}>
<Link as={`/p/${show.id}`} href={`/post?id=${show.id}`}>
<a>{show.name}</a>
</Link>
</li>
))}
</ul>
</Layout>
)
Index.getInitialProps = async function() {
const res = await fetch('https://api.tvmaze.com/search/shows?q=batman')
const data = await res.json()
console.log(`Show data fetched. Count: ${data.length}`)
return {
shows: data
}
}
export default Index
Моя проблема заключается в попытке подключить мою базу данных и показать ее приложению, чтобы я мог сделать что-то подобное на странице имен resources.js:
import Layout from '../components/Layout'
import Link from 'next/link'
const Resources = (props) => {
<Layout>
<h3>Resources</h3>
<ul style={listStyle}>
{props.resources.map(({resource}) => (
<li key={resource._id}>
<Link href={resource.link}>
<a>{resource.title}</a>
</Link>
</li>
))}
</ul>
</Layout>
};
Resources.getInitialProps = async function() {
// get query from mongo DB
// req is 'undefined' -- I want to see the db here
const list = await req.db.get('resources').find();
return list;
}
export default Resources;
Но я не знаю, как я могу представить базу данных в функции, к которой можно получить доступ со страниц в любом месте приложения. Кажется, что старые учебники примеров использовали что-то вроде server.use((req, res, next) => { req.db = dbToExpose });
в основном файле index.js
, но это не работает с Next.js v. 6 ??
Например, этот репозиторий из этого урока , похоже, не работает для меня с последней версией Next.js. Кладбище db req.db
выглядит как «неопределенное», когда вы пытаетесь получить к нему доступ со страницы. Но, возможно, я упускаю какую-то другую проблему.
Вот моя попытка в моем файле базового сервера выставить базу данных, чтобы я мог получить к ней доступ из файлов в pages/
:
const express = require('express')
const next = require('next')
const monk = require('monk')('localhost/myDatabase')
const dev = process.env.NODE_ENV !== 'production'
const app = next({ dev })
const handle = app.getRequestHandler()
app.prepare()
.then(() => {
const server = express()
// This is not working to expose the db!
server.use((req, res, next) => {
req.db = monk
next()
});
server.get('*', (req, res) => {
return handle(req, res)
})
server.listen(3000, (err) => {
if (err) throw err
console.log('> Ready on http://localhost:3000')
})
})
.catch((ex) => {
console.error(ex.stack)
process.exit(1)
})