【问题标题】:How to debug Heroku not performing external API requests?如何调试 Heroku 不执行外部 API 请求?
【发布时间】:2022-08-19 11:09:22
【问题描述】:

我在 heroku 上部署了我的应用程序,它的部分功能是因为我有“服务器”端代码,该代码使用 mongoDB 地图集对用户进行身份验证,并对 Yelp 的 API 执行 api 请求。我的应用程序对用户的身份验证很好,但是当我请求获取附近的地方时,我在控制台中收到此错误。

GET https://my-first-trip.herokuapp.com/category/21.3420389/-157.7992015/pizza 503 (Service Unavailable)

这是位于根目录中的server.js 的代码:

require(\'dotenv\').config()
const express = require(\'express\');
const app = express();
const cors = require(\"cors\");
const axios = require(\'axios\');
const mongoose = require(\"mongoose\")
const User = require(\'./models/user\')
const session = require(\'express-session\')
const bcrypt = require(\'bcrypt\')
const MongoStore = require(\'connect-mongo\')
const saltRounds = 6
const path = require(\'path\')

mongoose.connect(process.env.ATLAS_URI)

app.use(express.json());
app.use(cors({
  origin: [\"http://localhost:3000\"],
  methods: [\"GET\", \"POST\", \"DELETE\"],
  credentials: true
}))
// app.use(express.urlencoded())
app.set(\'trust proxy\', 1) // trust first proxy
app.use(session({
  secret: \'\',
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false },
  store: MongoStore.create({
    mongoUrl: process.env.ATLAS_URI,
    // collectionName: \'users\'
  })
}))

app.use(express.static(path.join(__dirname, \"client\", \"build\")))

app.get(\"/category/:lat/:lng/:searchCategory\", (req, res) => {
  const searchCategory = req.params.searchCategory
  // console.log(req.session.id)
  console.log(\"performing yelp businesses search request\")
  const lat = req.params.lat
  const lng = req.params.lng
  const config = {
    method: \'get\',
    url: \'https://api.yelp.com/v3/businesses/search?term=\' +
      searchCategory +
      \'&latitude=\' +
      lat +
      \'&longitude=\' +
      lng +
      \'&limit=3&sort_by=review_count\',
    headers: {
      \'Authorization\': process.env.YELP_API
    }
  };

  axios(config)
    .then((response) => {
      res.json(response.data)
      // console.log(response.data);
    })
    .catch((error) => {
      res.json(error) //this returns \'request failed with status code 400\'
    });

});



app.post(\'/signup\', (req, res) => {
  const email = req.body.email
  const plainTextPassword = req.body.password;

  //check if user already exists 
  User.find({ email: email }, (err, existingUser) => {
    if (existingUser.length === 0) {
      bcrypt.hash(plainTextPassword, saltRounds, async (err, hash) => {
        try {
          const user = new User({
            email: email,
            password: hash
          });
          let result = await user.save();
          if (result) {
            console.log(\"saved successfully\")
            res.send(result)
          }

        } catch (e) {
          res.send(\"Something Went Wrong\");
          console.log(\"something went wrong ---\" + e)
        }
      })
    } else {
      //notify user that account exists
    }
  })

})

//verify if user is ALREADY auth\'d
app.get(\'/login\', (req, res) => {
  console.log(\"testing\");
  // console.log(req.session + \' \' + req.session.id)
  if (req.session.user) {
    // console.log(\'already authenticated\')
    // console.log(req.session.id)
    res.json({ loggedIn: true })
  } else {
    res.json({ loggedIn: false })
  }

})

app.post(\'/login\', (req, res) => {
  const email = req.body.email;
  const plainTextPassword = req.body.password;
  User.find({ email: email }).limit(1).exec(function (err, existingUser) {
    if (existingUser.length === 0) {
      //tell user that account doesnt exist
      console.log(\"account doesnt exist\")
    } else {
      // console.log(existingUser[0])
      bcrypt.compare(plainTextPassword, existingUser[0].password, function (err, response) {
        if (response === true) {
          console.log(\'successfully logged in \')
          req.session.user = existingUser[0]._id
          res.json(req.session)
        } else {
          console.log(\"incorrect password \")
        }
      })
    }
  }
  )
})

app.get(\'/logout\', (req, res) => {
  req.session.destroy(() => {
    console.log(\"session has been deleted\")
    res.send({ loggedIn: false })
  })
})

app.get(\"*\", (req, res) => {
  res.sendFile(path.join(__dirname, \"client\", \"build\", \"index.html\"));
});
app.listen(process.env.PORT || 5000);

所以唯一不起作用的路线是app.get(\"/category/:lat/:lng/:searchCategory\"。在 heroku cli 中,我得到 code=H12desc=Request timeout。我非常有信心我的 yelp api 查询是一种快速且便宜的查询。我不确定如何进一步调试。

    标签: node.js reactjs express heroku


    【解决方案1】:

    您可以使用 Heroku Logging 详细了解您的错误:

    我总是用

    heroku logs -n 1000 --tail
    

    或者你也可以使用像papertrail这样的附加组件

    编辑:尝试硬编码您的 API 调用变量。

    【讨论】:

    • 你能详细说明一下吗?我已经使用您的建议来获取h12 的错误代码
    • yelp API 查询是否在本地环境中运行?
    • 是的。一切都在本地按预期运行
    • 运行 api 路由 "/category/:lat/:lng/:searchCategory" 时,它会返回错误消息“请求失败,状态代码为 400”,如 heroku 日志所示
    • 尝试替换 cors 对象宽度默认 app.use(cors) 并查看 API 是否返回没有 cors 的结果。
    猜你喜欢
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2020-06-29
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多