为啥我不能使用这样的环境变量?
Posted
技术标签:
【中文标题】为啥我不能使用这样的环境变量?【英文标题】:How come I can't use environment variables like this?为什么我不能使用这样的环境变量? 【发布时间】: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_URI
Channel.ts
中的环境变量?如果可以通过对dbConnect.ts
的修改来获得它,那就更奇怪了。
【参考方案1】:
您已经尝试创建一个 .env 文件并将变量存储在那里以供进程查看?您可以使用以下方式安装 dotenv:
npm i dotenv
//add dotenv to your index file
require('dotenv').config()
//this will in you .env file in the root of the project
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
//now you can use in the same way
process.env.MONGO_DB_URI
在我看来是一种简单的方法
【讨论】:
Next 不使用 .env 文件以上是关于为啥我不能使用这样的环境变量?的主要内容,如果未能解决你的问题,请参考以下文章
在IIS下,为啥安装php要在环境变量中加入php路径,有啥作用,为啥我没有加入也可以使用?
我的java环境变量设置好了,为啥不能CMD命令输入JAVA和JAVAC没用