我正在尝试使用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.js
和utils.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'})
一旦我添加了路径,它工作没有问题!