Предоставление подключения к базе данных mongodb для страниц в приложении Next.js 6 - PullRequest
0 голосов
/ 06 июля 2018

Я создаю приложение с 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)
})

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Вы не должны предоставлять какие-либо защищенные данные или подключаться к базе данных на страницах Nextjs. В этом сообщении показано, как подключиться к базе данных с помощью NextJs без API

.
0 голосов
/ 24 июля 2018

Вам нужно будет обернуть вашу базу данных Mongo в API, который вы можете использовать со следующим сервером, чтобы избежать проблем с CORS. Next не выставляет экспресс-запрос на страницы, так как он недоступен при рендеринге клиента.

...