为啥我不能使用这样的环境变量?

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.tsdbConnect.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环境变量设置好了,为啥不能CMD命令输入JAVA和JAVAC没用

为啥不能在 bash 4.1.2 中访问带有破折号的环境变量?

java环境变量已经配置好了为啥还是不能运行程序