process.env.CLIENT_ID在函数中工作,但在Express中不作为全局变量.<



我正在尝试使用oAuth与googleapi工作

我使用。env来隐藏。gitignore

我的问题是如果我试图定义

CLIENT_ID = process.env.CLIENT_ID 

在作为全局变量的函数之外,当我运行该变量并对其进行控制台记录时,它返回undefined。

但是,如果我尝试在函数外部定义它,并在控制台记录它,它显示undefined

如果我像这样设置我的控制器文件它会起作用

const passport = require('passport')
const validator = require('validator')
const User = require('../models/User')
const Company = require('../models/Company')
const { google } = require('googleapis');
const { OAuth2Client } = require('google-auth-library');
const axios = require('axios');
const auth = require('../middleware/auth');
const dayjs = require('dayjs')

exports.googleAuthCode = (req, res) => {
let CLIENT_ID = process.env.CLIENT_ID;
let CLIENT_SECRET = process.env.CLIENT_SECRET;
let REDIRECT_URL =  process.env.REDIRECT_URL;

const SCOPES = 'https://www.googleapis.com/auth/calendar';
const oAuth2Client = new google.auth.OAuth2(
CLIENT_ID,
CLIENT_SECRET,
REDIRECT_URL,

);
console.log('running googleAuthCode')
console.log('process.env.CLIENT_ID ', process.env.CLIENT_ID)
console.log('process.env.CLIENT_SECRET ', process.env.CLIENT_SECRET)
console.log('process.env.REDIRECT_URL ', process.env.REDIRECT_URL)
console.log('CLIENT_ID ', CLIENT_ID)
console.log('CLIENT_SECRET ', CLIENT_SECRET)
console.log('REDIRECT_URL ', REDIRECT_URL)

const authUrl = oAuth2Client.generateAuthUrl({

access_type: 'offline',
scope: SCOPES,
});
console.log('authURL: ',authUrl)
res.redirect(authUrl);

}

如果我像这样设置我的控制器它就不起作用了:


const passport = require('passport')
const validator = require('validator')
const User = require('../models/User')
const Company = require('../models/Company')
const { google } = require('googleapis');
const { OAuth2Client } = require('google-auth-library');
const axios = require('axios');
const auth = require('../middleware/auth');
const dayjs = require('dayjs')
let CLIENT_ID = process.env.CLIENT_ID;
let CLIENT_SECRET = process.env.CLIENT_SECRET;
let REDIRECT_URL =  process.env.REDIRECT_URL;

const SCOPES = 'https://www.googleapis.com/auth/calendar';
const oAuth2Client = new google.auth.OAuth2(
CLIENT_ID,
CLIENT_SECRET,
REDIRECT_URL,

);
exports.googleAuthCode = (req, res) => {

console.log('running googleAuthCode')
console.log('process.env.CLIENT_ID ', process.env.CLIENT_ID)
console.log('process.env.CLIENT_SECRET ', process.env.CLIENT_SECRET)
console.log('process.env.REDIRECT_URL ', process.env.REDIRECT_URL)
console.log('CLIENT_ID ', CLIENT_ID)
console.log('CLIENT_SECRET ', CLIENT_SECRET)
console.log('REDIRECT_URL ', REDIRECT_URL)

const authUrl = oAuth2Client.generateAuthUrl({

access_type: 'offline',
scope: SCOPES,
});
console.log('authURL: ',authUrl)
res.redirect(authUrl);

}

我使用的是dotenv

我正在使用MVC设置,

require('dotenv').config({path: './config/.env'})

是在我的server.js文件和导出到我的控制器文件。

如果你能透露一些光如何我可以得到这个工作作为一个全局变量,这将是非常感激的。

确保dotenv在所有其他模块之前导入。

假设我的项目中有两个文件:main.jsutils.js

// main.js
const { func1 } = require('./utils.js');
require('dotenv').config();
func1();
// utils.js
console.log(process.env.SOME_SECRET);
exports.func1 = function() {
console.log(process.env.SOME_SECRET);
}

在本例中,结果如下所示:

undefined
SECRET

原因是在解释器启动并解释每行时,全局环境变量是undefined,dotenv模块被解释和处理后,环境变量位于RAM中并获得值。

因此,在执行func1的最后一行中,环境变量具有value。

这就是为什么建议在主文件的第一行导入dotenv

所以正确的方法是这样的:

// main.js
require('dotenv').config();
const { func1 } = require('./utils.js');
func1();

感谢您的帮助!

答案是正确的,我必须将dotenv导入到我想要的控制器文件中。

但是我必须用

的格式来写
const dotenv = require('dotenv');
dotenv.config({path: './config/.env'})

一旦我添加了路径,它工作没有问题!

相关内容

最新更新