【发布时间】:2021-04-20 00:07:13
【问题描述】:
我已经使用 lerna 为我的项目建立了一个 monorepo,并且 website 包是使用 Next 编写的。
我有另一个名为 omega=lib 的包,它充当库,包含我的 mongo 数据库的模型/模式。它还有一个与之相连的函数。
在我的website 中,我试图从Channel 模式(存在于omega-lib)中获取一些数据,其代码如下所示:
Channel.ts
import { Schema, model, Document } from "mongoose";
import dbConnect from "../utils/dbConnect";
export interface IChannel extends Document {
name: string
logging_enabled: boolean
}
const ChannelSchema = new Schema({
name: { type: String, index: { unique: true } },
logging_enabled: Boolean
});
const Channel = model<IChannel>('Channel', ChannelSchema);
export const getChannel = async (username: string) => {
await dbConnect();
return Channel.findOne({ name: username });
}
export default Channel;
我正在尝试在我的一个页面中使用此代码,使用 getServerSideProps:
export const getServerSideProps = async (context: GetServerSidePropsContext<ParsedUrlQuery>) => {
console.log("DB", process.env.MONGO_DB_URI);
const userInfo: User = await getUser(context);
const moderators: User[] = await getModerators(context);
const channelInfo = await getChannel(userInfo.login);
console.log("CHANNEL INFO", channelInfo);
return {
props: {
userInfo,
moderators,
channelInfo
}
}
}
值得注意的是,在第 2 行,此值会正确记录到控制台!
这是问题开始的地方,当这段代码运行时,我得到这个错误:
MongooseError:
openUri()的uri参数必须是字符串,得到“未定义”。确保mongoose.connect()或mongoose.createConnection()的第一个参数是字符串。
这是在调用 dbConnect() 函数时产生的。这是代码:
import mongoose from 'mongoose';
const dbConnect = (uri?: string) => {
if (mongoose.connection.readyState >= 1) {
return;
}
return mongoose.connect(process.env.MONGO_DB_URI ?? uri, {
useNewUrlParser: true,
useUnifiedTopology: true,
useFindAndModify: false,
})
}
export default dbConnect;
我看不出MONGO_DB_URI 怎么可以为空,它在我的next.config.js 中定义:
module.exports = {
env: {
PRIVATE_KEY: "xxx",
CLIENT_ID: "xxx",
MONGO_DB_URI: "mongodb://localhost:27017/omegalogs",
REDIRECT_URI: "http://localhost:3000/login",
SCOPES: "user:read:email,moderation:read",
WEBSOCKET_PORT: 9393
},
};
值得注意的是,在上面的示例代码中打印了正确的值,但是在dbConnect() 中使用时它是undefined。
此dbConnect() 函数在omega-lib 包中定义,但用作依赖项。我不认为这是问题所在,因为它在另一个在环境文件中定义了相同 MONGO_DB_URI 的项目中运行良好。
这只有在我实际上将MONGO_DB_URI 环境变量作为参数传递给dbConnect() 时才有效,这就是为什么它是一个可选字符串。
谁能告诉我为什么dbConnect() 函数没有获取环境变量?它应该做这个服务器端,所以我不明白为什么它不会。
【问题讨论】:
-
您是否已经尝试将
console.log("DB", process.env.MONGO_DB_URI);添加到Channel.ts和dbConnect.ts只是为了100% 确定流程数据可用? -
@Forrest 是的,它只是在
Channel.ts中未定义 -
这看起来很奇怪,为什么你不能
console.log()MONGO_DB_URIChannel.ts中的环境变量?如果可以通过对dbConnect.ts的修改来获得它,那就更奇怪了。
标签: javascript reactjs typescript mongoose next.js