javascript - 为什么我不能使用这样的环境变量?
问题描述
我已经使用 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
},
};
值得注意的是,在上面的示例代码中打印了正确的值,但是undefined
在dbConnect()
.
此dbConnect()
函数在omega-lib
包中定义,但用作依赖项。我认为这不是问题,因为它在另一个MONGO_DB_URI
在环境文件中定义相同的项目中工作正常。
这仅在我实际上将MONGO_DB_URI
环境变量作为参数传递给 时才有效dbConnect()
,这就是它是可选字符串的原因。
谁能告诉我为什么该dbConnect()
函数没有拾取环境变量?它应该做这个服务器端,所以我不明白为什么它不会。
解决方案
您已经尝试创建一个 .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
在我看来是一种简单的方法
推荐阅读
- pine-script - 交叉和交叉功能不尊重我给松树脚本的参数
- assembly - STM指令后,为什么R6寄存器的内存位置是10、11、12?
- git - 从 master 恢复未推送的提交
- python-3.x - 合并两个或多个列表获得具有相同长度和统计信息的唯一组合
- sql - 如何使用查询替换 BQ 中的分区?
- python - 快速傅里叶变换(FFT) - 傅里叶分辨率问题
- extract - 创建人类基因中所有可能外显子的虚拟文库制备
- python - Python:等到函数在函数内部完成
- c++ - 使用填充的本地缓冲区 OpenCL 时像素值错误
- docker-compose - 如何在 docker-compose 中重用服务定义