【问题标题】:Deploying Node.js, express, knex app on Heroku - Unhandled rejection Error: Pool is destroyed在 Heroku 上部署 Node.js、express、knex 应用程序 - 未处理的拒绝错误:池被破坏
【发布时间】:2017-11-28 09:26:04
【问题描述】:

这里的超级大菜鸟 4 周前才开始编码,所以如果这个问题非常无知,我深表歉意。

我正在 Heroku 上部署这个小型 node.js express 和 knex 网络应用程序。一切都在本地运行良好。我已经从命令行成功创建了应用程序,并且所有页面都呈现了。我已经在 Heroku 上创建了 PostgreSQL 数据库,并且我已经成功地执行了迁移,以便我的表都已设置好。但是,当我尝试提交表单时,假设将数据插入数据库,我在日志中不断收到以下错误:

2017-06-25T06:01:57.360120+00:00 app[web.1]:未处理的拒绝错误:池被破坏 2017-06-25T06:01:57.360123+00:00 app[web.1]:在 Pool.acquire (/app/node_modules/pool2/lib/pool.js:162:12) 2017-06-25T06:01:57.360124+00:00 app[web.1]: 在 /app/node_modules/knex/ lib/client.js:268:29 2017-06-25T06:01:57.360125+00:00 app[web.1]: 在 Promise._execute (/app/node_modules/bluebird/js/release/debuggability.js:300 :9) 2017-06-25T06:01:57.360125+00:00 app[web.1]: 在 Promise._resolveFromExecutor (/app/node_modules/bluebird/js/release/promise.js:483:18) 2017-06 -25T06:01:57.360126+00:00 app[web.1]: 在新的 Promise (/app/node_modules/bluebird/js/release/promise.js:79:10) 2017-06-25T06:01:57.360127+ 00:00 app[web.1]:在 Client.acquireConnection (/app/node_modules/knex/lib/client.js:264:21) 2017-06-25T06:01:57.360131+00:00 app[web.1 ]: 在 /app/node_modules/knex/lib/runner.js:188:47 2017-06-25T06:01:57.360132+00:00 app[web.1]: 在 Promise._execute (/app/node_modules/bluebird /js/发布/可调试性。 js:300:9) 2017-06-25T06:01:57.360134+00:00 app[web.1]: at /app/node_modules/knex/lib/runner.js:187:35 2017-06-25T06:01 :57.360133+00:00 app[web.1]: 在新的 Promise (/app/node_modules/bluebird/js/release/promise.js:79:10) 2017-06-25T06:01:57.360135+00:00 app [web.1]:在 Function.Promise.attempt.Promise.try (/app/node_modules/bluebird/js/release/method.js:39:29) 2017-06-25T06:01:57.360132+00:00 应用[web.1]:在 Promise._resolveFromExecutor (/app/node_modules/bluebird/js/release/promise.js:483:18) 2017-06-25T06:01:57.360134+00:00 app[web.1]:在 tryCatcher (/app/node_modules/bluebird/js/release/util.js:16:23) 2017-06-25T06:01:57.360136+00:00 app[web.1]: 在 Runner.run (/app/ node_modules/knex/lib/runner.js:41:44) 2017-06-25T06:01:57.360136+00:00 app[web.1]: 在 Runner.ensureConnection (/app/node_modules/knex/lib/runner. js:186:39) 2017-06-25T06:01:57.360137+00:00 app[web.1]: 在 QueryBuilder.Target.then (/app/node_modules/knex/lib/interface.js:32:43)

我已经阅读了 Heroku 的教程,并阅读了他们的节点文档。我没有设置 Procfile,因为我从阅读中了解到这不是必需的。

这是我的 Knex 配置:

  production: {
    client: 'pg',
    connection: process.env.DATABASE_URL + '?ssl=true',
    debug: true,
    pool: {
      min: 2,
      max: 10
    },
    migrations: {
      directory: './db/migrations',
      tableName: 'migrations'
    }
  }

这是我的 server.js:

"use strict";

if (process.env.NODE_ENV !== 'production') require('dotenv').config();

const PORT        = process.env.PORT || 8080;
const ENV         = process.env.ENV || "development";
const express     = require("express");
const bodyParser  = require("body-parser");
const sass        = require("node-sass-middleware");
const app         = express();
var pg = require('pg');


const knexConfig  = require("./knexfile");
const knex        = require("knex")(knexConfig[ENV]);
const morgan      = require('morgan');
const knexLogger  = require('knex-logger');

// Seperated Routes for each Resource
const pollRoutes  = require("./routes/poll");
const voteRoutes  = require("./routes/vote");
const administrativeRoutes = require("./routes/administrative");
const dbHelper    = require("./lib/dbHelper")(knex);


app.use(morgan('dev'));

app.use(knexLogger(knex));

app.set("view engine", "ejs");
app.use(bodyParser.urlencoded({ extended: true }));
app.use("/styles", sass({
  src: __dirname + "/styles",
  dest: __dirname + "/public/styles",
  debug: true,
  outputStyle: 'expanded'
}));
app.use(express.static("public"));


app.get("/", (req, res) => {
  res.redirect("/create");
});
app.get("/error", (req, res) => {
  res.render('error');
});

// Mount all resource routes
app.use("/create", pollRoutes(dbHelper, process.env));
app.use("/vote", voteRoutes(dbHelper, process.env));
app.use("/administrative", administrativeRoutes(dbHelper));

// Home page

app.listen(PORT, () => {
  console.log("Example app listening on port " + PORT);
});

再次感谢任何帮助。在开始学习这些东西之前,我曾经是一名插画师,我很高兴为帮助我解决这个问题的人画一幅肖像

【问题讨论】:

    标签: javascript node.js heroku knex.js


    【解决方案1】:

    您的const ENV = process.env.ENV || "development"; 不断解决“开发”问题,当您推动生产时,这将是未定义的。这是因为您放置在 server.js 之上的条件语句。

    将其更改为:

    const ENV = process.env.NODE_ENV || 'development'
    

    你可以console.log你的knexENV常量来调试它们。

    【讨论】:

    • 感谢您的回答!我实际上设法解决了这个问题并回来为我的问题添加了一个答案,但我一定没有正确地提出答案。我实际上只需要设置一个 Heroku 配置变量:heroku config:set ENV=production,我的数据库就是这样连接的。但你是对的,这是 ENV 设置不正确的问题。
    猜你喜欢
    • 2016-01-15
    • 2014-04-12
    • 2016-01-10
    • 2020-04-29
    • 2016-01-29
    • 2021-04-06
    • 2018-06-19
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多