【问题标题】:Creating a fix for Heroku H12 timeout error trying to seed data to database for backend Node.js app为 Heroku H12 超时错误创建修复程序,尝试将数据播种到后端 Node.js 应用程序的数据库
【发布时间】:2021-06-24 11:09:51
【问题描述】:

转到 GET 路由以使用产品数据为我的 Heroku 数据库播种时遇到 H12 超时错误。我创建了执行 SeedProducts.seed 类方法的 get 路由 (/products/SEEDALLPRODUCTS),但是看起来错误在第一个 db.query 发生之前就出现了。我知道这不是最有效的方法,但是它可以在我的本地服务器上运行,并且不确定为什么我在使用 heroku 时遇到错误。

错误:

2021-03-27T22:42:47.394930+00:00 app[web.1]: GET /products/SEEDALLPRODUCTS - - - - ms 2021-03-27T22:42:47.395489+00:00 heroku[router]: at=error code=H12 desc="Request timeout" method=GET path="/products/SEEDALLPRODUCTS" host=freebay-backend.herokuapp.com request_id=c8b5fc3f-49d8-4465-9b44-71ccfa2923ec fwd="24.119.49.241" dyno=web.1 connect=1ms service=30000ms status=503 bytes=0 protocol=https

路线:

/** Routes for products. */

// const jsonschema = require("jsonschema");
const express = require("express");
const SeedProducts = require("../FreebaySeed");

// Seeds all products to database.
// Only to be called once at projects deployment
const router = new express.Router();
router.get("/SEEDALLPRODUCTS", async function (req, res, next) {
  try {
    const products = await SeedProducts.seed();
    console.log("products",products)
    return res.json("Successfully seeded products to database!");
  } catch (err) {
    return next(err);
  }
});

班级

"use strict";

const products1 = require("./products_1");
const products2 = require("./products_2");
const products3 = require("./products_3");

const db = require("./db");

class SeedProducts{

  static randomCondition(){
    const conditions = ["Brand New", "New - Open Box", "Good", "Used"]
    const condition = conditions[(Math.floor(Math.random() * 4))]
    return condition
  }

  static randomDate(start, end) {
    console.log("start",start)
    console.log("end",end)
    console.log("end.getTime() - start.getTime()",(end.getTime() - start.getTime()))

    let currentDateTime = new Date()

    return new Date(currentDateTime.getTime() + Math.random() * (36400000));
  }

  static randomRating() {
    return ((Math.floor(Math.random() * 4))+2)
  }
  
  static randomNumberOfRatings() {
    return (Math.floor(Math.random() * 1111))
  }

/** Method to seed all products into database */

  static async seed() {
   
    for (let i = 0; i < products1.length; i++) {
      console.log("[i]",[i])
      console.log("products1[i]",products1[i])
      const {item, category, sub_category, description, image_1, market_price} = products1[i]

      // Create Random DateTime object
      let auction_end_dt = SeedProducts.randomDate(new Date(2021, 3, 25), new Date())
      console.log("auction_end_dt in FreebaySeed.js", auction_end_dt)

      // Create starting price as 2/3 of the product's actual price
      let starting_bid = Math.round(market_price * .66)
      starting_bid = Math.round(100*starting_bid)/100
      console.log("starting_bid in FreebaySeed.js", starting_bid)


      // Grab random rating, number of ratings, and condition
      const num_of_ratings = SeedProducts.randomNumberOfRatings()
      const rating = SeedProducts.randomRating()
      const condition = SeedProducts.randomCondition()
      console.log("num_of_ratings in FreebaySeed.js", num_of_ratings)
      console.log("rating in FreebaySeed.js", rating)
      console.log("condition in FreebaySeed.js", condition)

      const valuesArray =
        [item, category, sub_category, description, condition, rating, num_of_ratings, image_1, starting_bid, auction_end_dt]

      await db.query(`INSERT INTO products (name, category, sub_category, description, condition, rating, num_of_ratings, image_url, starting_bid, auction_end_dt) 
      VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, valuesArray)
      }
    
    for (let i = 0; i < products2.length; i++) {
      console.log(i)
      const {item, category, sub_category, description, image_1, market_price} = products2[i]

      // Create Random DateTime object
      let auction_end_dt = SeedProducts.randomDate(new Date(2021, 3, 25), new Date())
      console.log("auction_end_dt", auction_end_dt)

      // Create starting price as half of the product's actual price
      let starting_bid = market_price * .5
      starting_bid = Math.round(100*starting_bid)/100

      // Grab random rating and number of ratings
      const num_of_ratings = SeedProducts.randomNumberOfRatings()
      const rating = SeedProducts.randomRating()
      const condition = SeedProducts.randomCondition()

      const valuesArray =
        [item, category, sub_category, description, condition, rating, num_of_ratings, image_1, starting_bid, auction_end_dt]

      await db.query(`INSERT INTO products (name, category, sub_category, description, condition, rating, num_of_ratings, image_url, starting_bid, auction_end_dt) 
      VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, valuesArray)
      }

    for (let i = 0; i < products3.length; i++) {
      console.log(i)
      const {item, category, sub_category, description, image_1, market_price} = products3[i]

      // Create Random DateTime object
      let auction_end_dt = SeedProducts.randomDate(new Date(2021, 3, 25), new Date())
      console.log("auction_end_dt", auction_end_dt) 

      // Create starting price as half of the product's actual price
      let starting_bid = market_price * .5
      starting_bid = Math.round(100*starting_bid)/100

      // Grab random rating and number of ratings
      const num_of_ratings = SeedProducts.randomNumberOfRatings()
      const rating = SeedProducts.randomRating()
      const condition = SeedProducts.randomCondition()

      console.log("item", item)
      const valuesArray =
        [item, category, sub_category, description, condition, rating, num_of_ratings, image_1, starting_bid, auction_end_dt]

      await db.query(`INSERT INTO products (name, category, sub_category, description, condition, rating, num_of_ratings, image_url, starting_bid, auction_end_dt) 
      VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)`, valuesArray)
      }
    }
}

module.exports = SeedProducts;

products_1.jsproducts_2.jsproducts_3.js 是三个大文件,每个文件都包含一组对象。

https://github.com/Bolmstead/freebay-backend/blob/master/products_1.js https://github.com/Bolmstead/freebay-backend/blob/master/products_2.js https://github.com/Bolmstead/freebay-backend/blob/master/products_3.js

只是好奇为什么我会收到此错误,因此我可以创建一个解决方法。提前致谢

【问题讨论】:

    标签: sql node.js postgresql heroku


    【解决方案1】:

    据我了解,您是通过向应用程序的数据库发送 GET 请求来植入应用程序的数据库的吗?恕我直言,让互联网上的任何人像这样播种您的数据库听起来不是一个好主意。

    您的应用程序是否使用框架?应该有一个命令来播种您的数据库。我知道对于 Rails 应用程序,可以运行以下命令来播种:

    heroku run rails db:seed
    

    您也可以复制脚本并直接在服务器上执行它们。另一种可能性是在本地执行它们,然后 push 你的数据库到 heroku。

    【讨论】:

    • 哇,不知道您可以将整个本地数据库推送到heroku。谢谢你!刚刚尝试运行heroku run node FreebaySeed.js 并遇到错误`UnhandledPromiseRejectionWarning: error: no pg_hba.conf entry for host...` 我确定这是我的代码中的一个错误,所以查看过去的 StackOverflow 帖子,看看我是否可以找到任何东西
    • 您是否尝试过激活 SSL? Heroku 现在要求在生产应用程序上激活 SSL。请参阅此处以获取修复 stackoverflow.com/questions/60048669/… 并在此处查看文档:help.heroku.com/DR0TTWWD/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-01
    • 2012-05-09
    • 1970-01-01
    • 2019-12-15
    • 2020-01-26
    • 2017-06-10
    • 2014-08-10
    相关资源
    最近更新 更多