我部署了一个Nodejs应用程序,它的后端到目前为止是Heroku。我在浏览器中收到应用程序错误。当我运行heroku logs
时,我看到了这个错误:
Error: Cannot find module './config/keys'
所以我运行heroku run 'ls -al'
,我看到了:
Running ls -al on ⬢ murmuring-temple-46226... up, run.3327 (Free)
total 284
drwx------ 8 u6811 dyno 4096 Apr 21 11:41 .
drwxr-xr-x 15 root root 4096 Apr 18 13:09 ..
-rw------- 1 u6811 dyno 21 Apr 21 11:37 .gitignore
drwx------ 3 u6811 dyno 4096 Apr 21 11:37 .heroku
drwx------ 2 u6811 dyno 4096 Apr 21 11:37 .profile.d
-rw------- 1 u6811 dyno 0 Apr 21 11:37 @1
-rw------- 1 u6811 dyno 574 Apr 21 11:37 index.js
drwx------ 2 u6811 dyno 4096 Apr 21 11:37 models
drwx------ 261 u6811 dyno 12288 Apr 21 11:38 node_modules
-rw------- 1 u6811 dyno 235090 Apr 21 11:37 package-lock.json
-rw------- 1 u6811 dyno 565 Apr 21 11:37 package.json
drwx------ 2 u6811 dyno 4096 Apr 21 11:37 routes
drwx------ 2 u6811 dyno 4096 Apr 21 11:37 services
我确实看到我的config
文件夹不在顶部的文件和文件夹列表中,但这可能是因为在我的.gitignore
文件中,我有它所以它会忽略{{ 1}}文件,或者可能是我的代码库中引用错误了吗?
这就是我在keys.js
中的要求:
index.js
这就是我在const express = require('express');
const mongoose = require('mongoose');
const cookieSession = require('cookie-session');
const passport = require('passport');
const keys = require('./config/keys');
require('./models/User');
require('./services/passport');
mongoose.connect(keys.mongoURI);
const app = express();
app.use(
cookieSession({
maxAge: 30 * 24 * 60 * 60 * 1000,
keys: [keys.cookieKey]
})
);
app.use(passport.initialize());
app.use(passport.session());
require('./routes/authRoutes')(app);
const PORT = process.env.PORT || 5000;
app.listen(PORT);
中引用它的方式:
services/passport.js
将应用程序成功部署到Heroku的最佳做法是什么?const passport = require('passport');
const GoogleStrategy = require('passport-google-oauth20').Strategy;
const mongoose = require('mongoose');
const keys = require('../config/keys');
const User = mongoose.model('users');
passport.serializeUser((user, done) => {
done(null, user.id);
});
passport.deserializeUser((id, done) => {
User.findById(id).then(user => {
done(null, user);
});
});
// passport.use() is a generic register to make Passport
// aware of new strategy
// creates a new instance to authenticate users
passport.use(
new GoogleStrategy(
{
clientID: keys.googleClientID,
clientSecret: keys.googleClientSecret,
callbackURL: '/auth/google/callback'
},
(accessToken, refreshToken, profile, done) => {
User.findOne({ googleId: profile.id }).then(existingUser => {
if (existingUser) {
// we already have a record with given profile id
done(null, existingUser);
} else {
// we dont have a user record with this id, make a new record
new User({ googleId: profile.id })
.save()
.then(user => done(null, user));
}
});
}
)
);
文件夹文件结构包含API密钥和其他信誉?
答案 0 :(得分:1)
我要做的是从keys.js
文件中删除.gitignore
。在config
文件夹中创建另外两个文件。一个用于开发,一个用于生产。将您的密钥放在开发文件中,然后让.gitignore
忽略该开发文件。
然后在keys.js
文件中创建一个if
语句,如下所示:
// keys.js - figure out what set of credentials to return
if (process.env.NODE_ENV === 'production') {
// we are in production - return the prod set of keys
module.exports = require('./prod');
} else {
// we are in development - return the dev keys!!
module.exports = require('./dev');
}
然后在您的生产文件中,您将像我上面的同事那样做,但可能更像是这样:
// prod.js - production keys here
module.exports = {
googleClientID: process.env.GOOGLE_CLIENT_ID,
googleClientSecret: process.env.GOOGLE_CLIENT_SECRET,
cookieKey: process.env.COOKIE_KEY
};
如果您还要连接到像MongoDB这样的数据库,那么您希望像上面这样添加mongoURI: process.env.MONGO_URI
。
您要做的最后一件事是确保在您的Heroku环境变量上定义所有这些不同的环境变量。
设置所有这些内容非常简单,您只需要知道在何处查看Herokus的控制界面,或者通过命令行终端进行操作,如上面的同事建议的那样。如果您对命令行终端非常熟悉,请继续按照上述步骤操作,如果没有,请转到浏览器中并导航至 dashboard.heroku.com
找到您为应用创建的应用,点击它。
然后点击“设置”标签,您会看到配置变量。点击显示配置变量,它应该为您提供一个界面来设置您要添加到应用程序中的所有不同变量。
逐个添加一个键及其对应的值
首先执行GOOGLE_CLIENT_ID
,复制并输入密钥,然后获取凭据。您应该已经在某处粘贴了凭据副本。
对COOKIE_KEY
执行相同操作,如果您使用的是Mongo,则为“MONGO_URI
所以现在你可以隐藏配置变量,没有人能够看到它们。
正如您可能想象的那样,您不希望任何人进入您的heroku帐户。如果有人进入你的heroku帐户,我不知道该告诉你什么。
现在,您可以使用git提交代码来部署应用程序,并使用git进行部署。
执行显示文件和文件夹的git status
。
git add .
git commit -m “completed environment variables”
git push
git push heroku master
你应该很好地接受这个错误消失了。
答案 1 :(得分:0)
你通过忽略配置文件来做正确的事情。你应该总是把你的密钥从github和bitbucket中删除。在这种情况下,正确的方法是将您的密钥设置为heroku上的环境变量。您可以使用以下命令:
# Add new variable
heroku config:set COOKIE_KEY=somekey
# Remove variable
heroku config:unset COOKIE_KEY
# Get all environment variables
heroku config
# Get environment variable by name
heroku config:get COOKIE_KEY
在您的应用程序中,您可以使用process.env
object:
process.env.COOKIE_KEY
process.env.GOOGLE_CLIENT_ID
process.env.GOOGLE_CLIENT_SECRET
注意:配置键必须为大写