首页 > 解决方案 > 为什么我不能使用这样的环境变量?

问题描述

我已经使用 lerna 为我的项目设置了一个 monorepo,并且该website包是使用 Next 编写的。

我有另一个称为omega=lib库的包,它包含我的 mongo 数据库的模型/模式。它还具有与之连接的功能。

在我的website中,我试图从Channel架构(存在于 中omega-lib)中获取一些数据,其代码如下所示:

频道.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:uri参数openUri()必须是字符串,得到“未定义”。确保mongoose.connect()or的第一个参数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
  },
};

值得注意的是,在上面的示例代码中打印了正确的值,但是undefineddbConnect().

dbConnect()函数在omega-lib包中定义,但用作依赖项。我认为这不是问题,因为它在另一个MONGO_DB_URI在环境文件中定义相同的项目中工作正常。

这仅在我实际上将MONGO_DB_URI环境变量作为参数传递给 时才有效dbConnect(),这就是它是可选字符串的原因。

谁能告诉我为什么该dbConnect()函数没有拾取环境变量?它应该做这个服务器端,所以我不明白为什么它不会。

标签: javascriptreactjstypescriptmongoosenext.js

解决方案


您已经尝试创建一个 .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

在我看来是一种简单的方法


推荐阅读