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

标签 javascript node.js mongodb express next.js

我正在使用 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来自this tutorial最新版本的 Next.js 似乎不适用于我。当您尝试从页面访问它时,通过 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)
})

最佳答案

您不应暴露任何安全数据或在 Nextjs 页面中进行数据库连接。这篇文章为 connect to database with NextJs 指明了方向没有API

关于javascript - 将 mongodb 数据库连接公开到 Next.js 6 应用程序中的页面,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51207609/

相关文章:

javascript - 谷歌浏览器移动模拟器 : how to force it to open new tab in emulator also?

javascript - Stripe Checkout Modal 的事件或方法

javascript - 使用javascript选择计算税率

node.js - 如何使用 Protractor 以非阻塞方式执行shell脚本?

node.js - 一个带有 Node js 的应用程序,每个客户端不同的数据库

javascript - 谷歌地图 API v3 : Handle usage Limit restriction

javascript - 无法访问此函数内的参数

node.js - 用于 NodeJS API 的身份服务器 4

node.js - Mongoose findOne({电子邮件 : email}) often works rarely doesn't work?

java - 如何在 Spring boot 中对 MongoTemplate 的 Autowired 实例调用 MongoTemplate 函数