【问题标题】:Get requests return html code instead of real data获取请求返回 html 代码而不是真实数据
【发布时间】:2020-05-03 04:08:51
【问题描述】:

我的应用是使用 Vue 和 Express 开发的。 我的应用程序中有一个错误仅发生在 Heroku 或生产环境中,而不发生在 localhost 或开发环境中。
我的应用程序已开启
赫罗库:https://immense-refuge-12167.herokuapp.com/
github:https://github.com/powerseed/tabtracker_production
如果点击左上角的“浏览器”链接,控制台上会打印一个名为“response”的对象,如下图所示: 它是从后端返回的响应,其 data 属性应该包含从 PostgresSQL 数据库返回的 song 对象。
但是,它的data 属性包含HTML 代码,其内容是:

<!DOCTYPE html>
<html>
<head>
  <meta charset=utf-8>
  <meta name=viewport content="width=device-width,initial-scale=1">
  <link href="https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900" rel=stylesheet>
  <title>TabTracker</title>
  <link href=/static/css/app.a56f85525b4e670fc7da4a6aaae97f55.css rel=stylesheet>
</head>
<body>
<div id=app></div>
<script type=text/javascript src=/static/js/manifest.2ae2e69a05c33dfc65f8.js></script>
<script type=text/javascript src=/static/js/vendor.eb5d49c013eada509bc8.js></script>
<script type=text/javascript src=/static/js/app.913b2b7edc7aedfb34fe.js></script></body></html>

我想知道为什么...这个错误不会发生在本地主机上。在localhost上,输出如下图,是正确的。
这是我在客户端中的代码,它将get 请求发送到后端以获取song 对象。

.
.
.
      async mounted() {
        const response = (await api.getSongs(this.search))
        this.songs = response.data;
        console.log({response})
        console.log(this.songs)

api.getSongs() 方法是:
(请忽略this.search参数,测试时忽略)

  const URL = "";

  getSongs(search){
    return axios.get(URL + "songs", {
      params:{
        search: search
      }
    });
  },

在 beckend 中,处理get 请求并从 DB 中检索的方法是:

app.get("/songs", async function (req, res) {
    try{
        let allSongs = await Song.findAll({
            limit: 10
        })
        res.send(allSongs);
    }
    catch (e) {
        res.status(500).send({
            error: 'An error occurred when getting all songs. '
        })
    }
})

这很奇怪,因为它在 localhost 上完美运行,但在 Heroku 上出现了这个错误。
我认为数据库连接正确,因为注册和登录功能工作正常。
您只有在注册后才能登录。他们都是post 请求。所以我猜这个问题只是关于get

此外,这是我的proxy 配置: client/config/index.js

module.exports = {
  dev: {
    // Paths
    assetsSubDirectory: 'static',
    assetsPublicPath: '/',
    proxyTable: {
      '/': {
        target: 'http://localhost:8081',
      }
    },

提前致谢!

更新:
我尝试添加headers: {Accept: 'application/json'}headers: {'Content-Type': 'application/json'},但响应始终为text/html,这与我的本地主机不同,即使我没有添加'Content-Type': 'application/json',它也始终为application/json

【问题讨论】:

  • 试试添加headers: {'content-type': 'application/json' }
  • 你能告诉我在哪里添加吗?我刚开始学习前端。 @upog
  • Axios 在它的配置对象中获取一个 headers 键。你可以在那里添加它。看起来像这样:headers: {'Content-Type': 'application/json'}
  • 我很好奇 data 键中的 HTML 是什么。您是否尝试复制并粘贴到 html 文件中并在浏览器中呈现它?可能是返回为 HTML 的错误
  • @DanFletcher 我更新了这篇文章添加了html代码,请看一下。

标签: javascript node.js vue.js sequelize.js


【解决方案1】:

快速路由器有问题。对于任何GET 请求,您的后端(快递)正在响应首页内容。

尝试在浏览器中直接点击这些网址并观察行为:

https://immense-refuge-12167.herokuapp.com/songs?search=
https://immense-refuge-12167.herokuapp.com/allBookmarks?userId=3

我尝试过使用不存在的 url,它也被解析为200 OK。应该是404 Not found

https://immense-refuge-12167.herokuapp.com/songs/invalid/url/test?search=

【讨论】:

  • 我试过了,但似乎没有什么不同......你能给我更多的提示吗?
  • 为此,我需要按顺序设置路由的入口文件(app.js 或 index.js)。尝试添加一些记录器(摩根)。谁在处理GET 请求,是express 的静态中间件吗?您的应用程序前面是否有缓存服务器?配置错误,因此每个GET 请求其响应相同的内容?可能会发生。
  • 你说的在我的本地主机上是真的。当我输入http://localhost:8080/songs/invalid/url/test?search= 时,它返回了Cannot GET /songs/invalid/url/test。但是在 Heroku 上发生了奇怪的事情......真的不知道为什么......
  • github.com/powerseed/tabtracker_production 这是我的应用程序的 github 存储库。如果您能帮我解决这个问题,我将不胜感激~
  • 我认为 app.js:91 中的这个声明导致了这个问题。对于任何获取请求,它都会发送 index.html 内容。你应该删除它。 app.get(/.*/, function (req, res) { res.sendFile(path.resolve(__dirname, '../public/index.html')) })
【解决方案2】:

您是否尝试将接受标头添加到 application/json?

return axios
  .get(URL + 'songs', {
    headers: { Accept: 'application/json' },
    params: { 
        search: search 
    },
  })
  .then((response) => {
    console.log(response.data);
  })
  .catch((error) => {
    console.log('error ' + error);
  });

【讨论】:

  • 我正在尝试这个,很快就会回复您。但似乎 Heroku 总是以text/html 发送响应,即使我设置了{'Content-Type': 'application/json'}。这与我的本地不同,它总是application/json
  • 对不起,我不工作了。。我已经推到Heroku了,你可以看到它仍然是text/html
  • github.com/powerseed/tabtracker_production 这是我的应用程序的 github 存储库。如果您能帮我解决这个问题,我将不胜感激~
猜你喜欢
  • 1970-01-01
  • 2021-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-25
  • 1970-01-01
  • 2017-12-21
相关资源
最近更新 更多