Heroku 错误:找不到模块“./config/keys”

2024-04-11

我部署了一个 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文件,我有它,所以它会忽略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:

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));
        }
      });
    }
  )
);

使用以下命令将应用程序成功部署到 Heroku 的最佳实践是什么?config/keys.js包含 API 密钥和其他凭证的文件夹文件结构?


我要做的就是删除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 的控制界面上查看哪里或按照我上面的同事的建议通过命令行终端进行操作即可。如果您对命令行终端非常熟悉,请继续执行上述步骤,如果不熟悉,请进入浏览器并导航到仪表板.heroku.com

找到您为应用程序创建的应用程序,单击它。

然后单击设置选项卡,您应该看到配置变量。单击“显示配置变量”,这将为您提供一个界面来设置要添加到应用程序中的所有不同变量。

逐一添加一个键及其对应的值

所以首先要做的是GOOGLE_CLIENT_ID,复制该内容并将其作为密钥输入,然后获取您的凭据。您应该已经将凭据副本粘贴到某处。

做同样的事COOKIE_KEY如果您使用 Mongo,`MONGO_URI

所以现在你可以隐藏配置变量,没有人能够看到它们。

正如您可能想象的那样,您不希望任何人进入您的 heroku 帐户。如果有人进入你的 heroku 帐户,我不知道该告诉你什么。

现在,您可以通过使用 git 提交代码来部署应用程序,也可以使用 git 进行部署。

Do a git status显示您的文件和文件夹。

git add .

git commit -m “completed environment variables”

git push

git push heroku master

当错误消失后,您应该可以继续执行此操作。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Heroku 错误:找不到模块“./config/keys” 的相关文章

随机推荐

  • Visual Studio Code 自定义语言 IntelliSense 和转到符号

    我正在为 Visual Studio Code 中的自定义语言编写扩展 语法检测通过 tmLanguage 文件运行良好 我试图弄清楚如何添加智能感知并转到符号支持 但我无法找到清晰的文档或参考文件来进行工作 当我打开一个文件并选择自定义语
  • Magento 一个订单可使用多个优惠券代码,无需延期

    我已经工作了 3 天 试图在一个订单中应用多个优惠券代码 我知道有可用的模块 但我不想投资购买模块 我想要一些自定义代码 以便我可以在单个订单中应用多个优惠券代码 要添加 2 个优惠券代码 我所做的是这样的 1 在 sales flat q
  • 如何让程序在ssh退出后继续运行? [复制]

    这个问题在这里已经有答案了 可能的重复 防止后台进程在关闭 SSH 客户端后停止 https stackoverflow com questions 285015 linux prevent a background process fro
  • 如何获取在 TreeView 控件中选择的所有父节点(直到根节点)?

    如果我有一个 TreeView myTreeview 如何获取所选节点的所有父节点 父节点 父节点的父节点等 的列表 我建议您创建一组自己的树助手 例如 下一个是针对您的问题的 public static class TreeHelpers
  • 在 Python 中标记一个保留分隔符的字符串

    有没有相当于str split在Python中也返回分隔符 在处理一些标记后 我需要保留输出的空白布局 Example gt gt gt s tthis is an example gt gt gt print s split this i
  • 使用 XML 命名空间前缀和指定 xmlns="blah" 作为属性之间的区别

    以下 xml 片段在命名空间方面有何区别 如果有 Form1
  • 如何在Python中使用保存模型进行预测

    我正在 python 中进行文本分类 我想在生产环境中使用它来对新文档进行预测 我正在使用 TfidfVectorizer 来构建 bagofWord 我在做 X train vectorizer fit transform clean d
  • 实体框架 4.1 设计器是否可以仅针对选定的实体“从数据库更新模型”?

    情况 有时 数据库模式并不是您所认为的系统信息的理想表示 并且您可能无法更改它 我们一直在使用实体框架创建一个更好的概念模型 以便在这种情况下进行编码 这意味着从数据库更新模型 然后通过设计器或直接使用文本编辑器直接通过 edmx 文件自行
  • Javascript 中的同步睡眠函数

    我想使用 JS JQuery 模拟进度条 这是我的 HTML 代码 p 0 p 我想从 0 到 100 并以慢动作看到 视觉上的进度 所以我真正需要的是一个 For 循环和一个暂停函数 但不幸的是没有类似睡眠的函数Javascript 第一
  • 将代码热交换到“mvnDebug tomcat:run”

    通常我使用启动tomcatmvnDebug tomcat run 代码更改后我需要使用mvn tomcat redeploy 这是次优的 因为我经常只更改现有方法体的内容 我可以将方法的主体热交换到运行时中 然后进行热重新部署作为后备吗 不
  • UITableView:我可以删除多行吗?

    我想根据用户的选择从表视图中删除多行 显然我不能使用didSelectRowAtIndexPath方法 因为它将为所选的每一行调用 我想让用户选择多行进行删除 然后一次性删除它们 是否可以 如果是 那么该怎么办呢 另外 我正在使用基于单视图
  • 如何配置 ASP.NET Core 1.0 以使用本地 IIS 而不是 IIS Express?

    我怎样才能设置一个 Net核心1 0项目使用本地IIS代替IIS 快递调试时 我尝试过修改启动设置 json以各种方式归档 例如 替换所有出现的IIS 快递 with 本地IIS并更新应用程序网址 and 启动网址使用我的自定义本地主机ht
  • 使用 DisplaCy 将 SpaCy 渲染文件保存为 SVG

    我有以下代码 import spacy from spacy import displacy from pathlib import Path nlp spacy load en core web sm parse True tag Tru
  • 为什么我们需要在重载 >> 和 << 运算符时返回对 istream/ostream 的引用?

    如果我不回来会怎样din or dout 实际上我正在读一本书 其中作者返回了返回流引用 istream operator gt gt istream din vector a for int i 0 i
  • 主题应用程序中的样式 SnackBar

    我需要帮助 如何更改样式应用程序中小吃栏中文本的设计 我对代码的更改不感兴趣 我找到了以下代码 但这对我不起作用 这是为什么 我的主题源自 style Theme AppCompat Light DarkActionBar 我将非常感谢您的
  • 如何监控 DOM 的变化?

    有没有一种方法 使用 jQuery 或其他方式 来监视 DOM 的插入 删除 样式更新等 请参阅此处的 MutationEvent 元素 https developer mozilla org en DOM DOM event refere
  • 插件和主题之间的依赖冲突

    我在我的网站上安装了自定义主题和 SMTP 插件 它们都包含用于不同目的的 Google API PHP 客户端 不幸的是 插件和主题使用的依赖是不同版本的 并且它们无法轻松升级或降级 这会导致冲突 插件从主题加载包而不是自己的包 并抛出错
  • Axis HTTP 与 Axis HTTPS 代理设置

    我部署在 Weblogic 集群上的 Java 应用程序调用两个 Web 服务 如下所示 它通过 HTTPS 将 SOAP 客户端请求发送到互联网上的外部应用程序 通过 Axis 1 4 创建的 Java 类 此后 它通过 HTTP 将 S
  • 在 Erlang 中使用完全限定的函数调用?

    我刚刚学习了如何在 Erlang 中升级模块 并且我知道只有使用完全限定名称的函数调用 例如module function 重新链接 到加载到 VM 中的当前版本 但未指定模块名称的函数调用不会 重新链接 到当前版本 而是继续使用旧版本 关
  • Heroku 错误:找不到模块“./config/keys”

    我部署了一个 Nodejs 应用程序 到目前为止它的后端是 Heroku 我在浏览器中收到应用程序错误 当我跑步时heroku logs 我看到这个错误 Error Cannot find module config keys 所以我运行一