正在为Heroku H12超时错误创建修复程序,该错误试图将数据种子植入后端Node.js应用程序的数据库



在使用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.jshttps://github.com/Bolmstead/freebay-backend/blob/master/products_2.jshttps://github.com/Bolmstead/freebay-backend/blob/master/products_3.js

只是好奇我为什么会出现这个错误,这样我就可以创建一个变通方法。提前感谢

据我所知,您通过向应用程序的数据库发送GET请求来为其播种?IMHO,这听起来不是一个好主意,允许任何人在互联网上种子你的数据库。

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

heroku run rails db:seed

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

相关内容

最新更新