使用 Next.js 10 TypeScript 项目缓存 MongoDb 连接 - API 路由
Posted
技术标签:
【中文标题】使用 Next.js 10 TypeScript 项目缓存 MongoDb 连接 - API 路由【英文标题】:Cache MongoDb connection with Next.js 10 TypeScript Project - API Route 【发布时间】:2021-04-23 01:01:14 【问题描述】:我正在尝试将 next.js/examples/with-mongodb/util/mongodb.js 转换为 TS,以便我可以在 TS next.js 项目中缓存并恢复与 Mongo 的连接。我在cache.promise
上收到一个 TS 错误,上面写着:
Type 'Promise<MongoClient | client: MongoClient; db: Db; >' is not assignable to type 'Promise<MongoClient>'
我应该如何在 global 上正确声明 mongo 属性以安抚 TS 大神?
import MongoClient, Db from "mongodb";
const DATABASE_URL, DATABASE_NAME = process.env;
declare global
namespace NodeJS
interface Global
mongo:
conn: MongoClient | null;
promise: Promise<MongoClient> | null;
;
let cached = global.mongo;
if (!cached)
cached = global.mongo = conn: null, promise: null ;
async function connect()
if (cached.conn)
return cached.conn;
if (!cached.promise)
const opts =
useNewUrlParser: true,
useUnifiedTopology: true,
;
cached.promise = MongoClient.connect(DATABASE_URL, opts).then((client) =>
return
client,
db: client.db(DATABASE_NAME),
;
);
cached.conn = await cached.promise;
return cached.conn;
export connect ;
【问题讨论】:
nextjs with-mongodb 已更改。你没有把新版本转换成 TypeScript。如果是的话,请你分享一下 【参考方案1】:你不需要缓存你的连接,用 mongodb example 检查最新的 nextjs。 mongodb官方论坛experts have navigated我这个示例项目。
尝试使用原生解决方案
【讨论】:
【参考方案2】:您存储的“conn
”属性包含MongoClient
和 Db
。
在mongo
的全局声明中,您只包含了MongoClient
。我的项目中有完全相同的代码,我处理它的方式是简单地创建一个名为MongoConnection
的基本类型,它包含两者。代码如下。
type MongoConnection =
client: MongoClient;
db: Db;
;
declare global
namespace NodeJS
interface Global
mongo:
conn: MongoConnection | null;
promise: Promise<MongoConnection> | null;
【讨论】:
【参考方案3】:似乎答案是将 mongo 属性设置为 any
,如下所示:
declare global
namespace NodeJS
interface Global
mongo: any;
【讨论】:
有人找到更好的解决方案了吗?如果是,请发布作为答案。以上是关于使用 Next.js 10 TypeScript 项目缓存 MongoDb 连接 - API 路由的主要内容,如果未能解决你的问题,请参考以下文章
在 TypeScript 和 Next.js 中使用绝对导入解析模块
在带有 TypeScript 的 Next.js 中使用 getInitialProps
使用 getStaticProps 获取数据 Next.js 和 Typescript
如何在带有 TypeScript 的 next.config.js 中使用 i18n 和 next/image?
使用`let cached = global.mongoose`时出现Next.js + Typescript + mongoose错误
如何使用 Next.js、Ant Design、Less 和 TypeScript 配置 Storybook.js Webpack