我正在使用 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/