Deploying Node.js, express, knex app on Heroku - Unhandled rejection Error: Pool is destroyed
Deploying Node.js, express, knex app on Heroku - Unhandled rejection Error: Pool is destroyed
这里的超级大菜鸟 4 周前才开始编码,所以如果这个问题非常无知,我深表歉意。
我正在 Heroku 上部署这个小型 node.js express 和 knex 网络应用程序。一切都在本地运行良好。我已经从命令行成功创建了应用程序,并且所有页面都呈现了。我已经在 Heroku 上创建了 PostgreSQL 数据库,并且我已经成功地执行了迁移,所以我的表都已经设置好了。但是,当我尝试提交一个表单,假设将数据插入数据库时,我在日志中不断收到以下错误:
2017-06-25T06:01:57.360120+00:00 app[web.1]: Unhandled rejection Error: Pool is destroyed 2017-06-25T06:01:57.360123+00:00 app[web.1]: at Pool.acquire (/app/node_modules/pool2/lib/pool.js:162:12) 2017-06-25T06:01:57.360124+00:00 app[web.1]: at /app/node_modules/knex/lib/client.js:268:29 2017-06-25T06:01:57.360125+00:00 app[web.1]: at Promise._execute (/app/node_modules/bluebird/js/release/debuggability.js:300:9) 2017-06-25T06:01:57.360125+00:00 app[web.1]: at Promise._resolveFromExecutor (/app/node_modules/bluebird/js/release/promise.js:483:18) 2017-06-25T06:01:57.360126+00:00 app[web.1]: at new Promise (/app/node_modules/bluebird/js/release/promise.js:79:10) 2017-06-25T06:01:57.360127+00:00 app[web.1]: at Client.acquireConnection (/app/node_modules/knex/lib/client.js:264:21) 2017-06-25T06:01:57.360131+00:00 app[web.1]: at /app/node_modules/knex/lib/runner.js:188:47 2017-06-25T06:01:57.360132+00:00 app[web.1]: at Promise._execute (/app/node_modules/bluebird/js/release/debuggability.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]: at new Promise (/app/node_modules/bluebird/js/release/promise.js:79:10) 2017-06-25T06:01:57.360135+00:00 app[web.1]: at Function.Promise.attempt.Promise.try (/app/node_modules/bluebird/js/release/method.js:39:29) 2017-06-25T06:01:57.360132+00:00 app[web.1]: at Promise._resolveFromExecutor (/app/node_modules/bluebird/js/release/promise.js:483:18) 2017-06-25T06:01:57.360134+00:00 app[web.1]: at tryCatcher (/app/node_modules/bluebird/js/release/util.js:16:23) 2017-06-25T06:01:57.360136+00:00 app[web.1]: at Runner.run (/app/node_modules/knex/lib/runner.js:41:44) 2017-06-25T06:01:57.360136+00:00 app[web.1]: at Runner.ensureConnection (/app/node_modules/knex/lib/runner.js:186:39) 2017-06-25T06:01:57.360137+00:00 app[web.1]: at 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);
});
再次感谢您的帮助。在开始学习这些东西之前,我曾经是一名插画师,我很乐意为帮助我解决这个问题的人画肖像<3
您的 const ENV = process.env.ENV || "development";
不断解析为 "development,",这在您投入生产时将是未定义的。这是因为您将条件语句放在 server.js.
之上
将此更改为:
const ENV = process.env.NODE_ENV || 'development'
您可以 console.log
您的 knex
和 ENV
常量来调试它们。
这里的超级大菜鸟 4 周前才开始编码,所以如果这个问题非常无知,我深表歉意。
我正在 Heroku 上部署这个小型 node.js express 和 knex 网络应用程序。一切都在本地运行良好。我已经从命令行成功创建了应用程序,并且所有页面都呈现了。我已经在 Heroku 上创建了 PostgreSQL 数据库,并且我已经成功地执行了迁移,所以我的表都已经设置好了。但是,当我尝试提交一个表单,假设将数据插入数据库时,我在日志中不断收到以下错误:
2017-06-25T06:01:57.360120+00:00 app[web.1]: Unhandled rejection Error: Pool is destroyed 2017-06-25T06:01:57.360123+00:00 app[web.1]: at Pool.acquire (/app/node_modules/pool2/lib/pool.js:162:12) 2017-06-25T06:01:57.360124+00:00 app[web.1]: at /app/node_modules/knex/lib/client.js:268:29 2017-06-25T06:01:57.360125+00:00 app[web.1]: at Promise._execute (/app/node_modules/bluebird/js/release/debuggability.js:300:9) 2017-06-25T06:01:57.360125+00:00 app[web.1]: at Promise._resolveFromExecutor (/app/node_modules/bluebird/js/release/promise.js:483:18) 2017-06-25T06:01:57.360126+00:00 app[web.1]: at new Promise (/app/node_modules/bluebird/js/release/promise.js:79:10) 2017-06-25T06:01:57.360127+00:00 app[web.1]: at Client.acquireConnection (/app/node_modules/knex/lib/client.js:264:21) 2017-06-25T06:01:57.360131+00:00 app[web.1]: at /app/node_modules/knex/lib/runner.js:188:47 2017-06-25T06:01:57.360132+00:00 app[web.1]: at Promise._execute (/app/node_modules/bluebird/js/release/debuggability.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]: at new Promise (/app/node_modules/bluebird/js/release/promise.js:79:10) 2017-06-25T06:01:57.360135+00:00 app[web.1]: at Function.Promise.attempt.Promise.try (/app/node_modules/bluebird/js/release/method.js:39:29) 2017-06-25T06:01:57.360132+00:00 app[web.1]: at Promise._resolveFromExecutor (/app/node_modules/bluebird/js/release/promise.js:483:18) 2017-06-25T06:01:57.360134+00:00 app[web.1]: at tryCatcher (/app/node_modules/bluebird/js/release/util.js:16:23) 2017-06-25T06:01:57.360136+00:00 app[web.1]: at Runner.run (/app/node_modules/knex/lib/runner.js:41:44) 2017-06-25T06:01:57.360136+00:00 app[web.1]: at Runner.ensureConnection (/app/node_modules/knex/lib/runner.js:186:39) 2017-06-25T06:01:57.360137+00:00 app[web.1]: at 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);
});
再次感谢您的帮助。在开始学习这些东西之前,我曾经是一名插画师,我很乐意为帮助我解决这个问题的人画肖像<3
您的 const ENV = process.env.ENV || "development";
不断解析为 "development,",这在您投入生产时将是未定义的。这是因为您将条件语句放在 server.js.
将此更改为:
const ENV = process.env.NODE_ENV || 'development'
您可以 console.log
您的 knex
和 ENV
常量来调试它们。