将 mongodb 数据库连接公开到 Next.js 6 个应用中的页面

Expose mongodb database connection to pages in Next.js 6 app

我正在使用 Next.js v6 构建应用程序,我想用本地 mongodb 数据库的结果填充页面。

理想情况下,我想做一些像 this example from the tutorial 这样简单的事情,但是 不使用 api 获取,而是向我的 mongodb 发送一个查询在本地主机上。

示例来自 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;

但我不知道如何在可以从应用程序中任何位置的页面访问的函数中公开数据库。似乎较早的示例教程在 index.js 主文件中使用了类似 server.use((req, res, next) => { req.db = dbToExpose }); 的内容,但这似乎不适用于 Next.js v. 6?

例如,this sample repo from this tutorial 似乎不适用于最新版本的 Next.js。当您尝试从页面访问数据库时,通过 req.db 暴露的数据库显示为 'undefined'。但也许我遗漏了一些其他问题。

这是我在基本服务器文件中公开数据库的尝试,以便我可以从 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)
})

您需要将 Mongo 数据库包装在 API 中,您可以将其与下一个服务器一起使用以避免 CORS 问题。 Next 不会向页面公开 Express 请求,因为这在客户端呈现时不可用。

您不应在 Nextjs 页面中暴露任何安全数据或进行数据库连接。此 post 显示 connect to database with NextJs 没有 api

的方法