Express服务器的axios响应中未填充“数据”字段

时间:2019-11-14 04:48:49

标签: node.js express vue.js get axios

我正在尝试使用服务器上的Express和后端上的Axios从nodejs服务器访问数据。

这是我想要达到的目标:http://gentle-bastion-49098.herokuapp.com/api/filters

如您所见,当您导航到它时,它实际上会返回数据。但是,当我尝试使用以下代码访问它时:

const BASE_URL = 'http://gentle-bastion-49098.herokuapp.com/api'

function getFilterData () {
  const url = `${BASE_URL}/filters`
  return axios.get(url)
}
getFilterData()
        .then(function (response) {
          console.log('filter', response)
        })
        .catch(err => {
          alert('Could not get filters ' + err.message.toString())
        })

我收到此响应,但未填充“数据”字段,我希望它包含您在URL中看到的JSON。

{
    "data": "",
    "status": 200,
    "statusText": "OK",
    "headers": {},
    "config": {
        "url": "http://gentle-bastion-49098.herokuapp.com/api/filters",
        "method": "get",
        "headers": {
            "Accept": "application/json, text/plain, */*"
        },
        "transformRequest": [null],
        "transformResponse": [null],
        "timeout": 0,
        "xsrfCookieName": "XSRF-TOKEN",
        "xsrfHeaderName": "X-XSRF-TOKEN",
        "maxContentLength": -1
    },
    "request": {}
}

这是后端代码

const express = require('express');
const app = express();
const async = require('async');
const request = require('request');
const http = require('http');
const EventSource = require('eventsource');
const port = process.env.PORT || 8080;

const bodyParser = require('body-parser');
const jsonParser = bodyParser.json()

app.get('/api/filters', function(req, res) {
    let filtersResponse = {
        "ID": "CONV_DATA@IVA",
        "ApplicationName": "InterationsView",
        "Type": "FILT_DETAIL",
        "filters": [{
                "Name": "ChannelType",
                "Values": uniqueFilters.ChannelType,
            },
            {
                "Name": "sessionType",
                "Values": uniqueFilters.sessionType,
            },
            {
                "Name": "Direction",
                "Values": uniqueFilters.Direction,
            },
            {
                "Name": "Status",
                "Values": uniqueFilters.Status,
            },
            {
                "Name": "statusReason",
                "Values": uniqueFilters.statusReason,
            },
        ],
        "minDuration": uniqueFilters.minDuration,
        "maxDuration": uniqueFilters.maxDuration,
        "minData": "2019-08-29T22:28:47.029UTC",
        "maxDate": "2019-08-29T22:28:49.578UTC"
    };

    // Respond with filters
    res.json(filtersResponse);
});

关于为什么即使通过浏览器或邮递员访问数据字段仍返回所需数据的情况下,为何不填充数据字段的任何想法?后端或发出请求的方式是否有问题?谢谢。 我还启用了浏览器上的跨组织资源共享。不这样做会导致错误

2 个答案:

答案 0 :(得分:1)

我不清楚您是没有得到axios响应还是节点服务器的响应。如果您在获取axios响应时遇到问题,请使用以下代码。

我已经使用request npm来进行获取请求。

const request = require('request');

apiUrl = "http://gentle-bastion-49098.herokuapp.com/api/filters"

request.get(
    {
        url: apiUrl,
        json: true
    },
    function (error, response, body) {
        if (error) {
            console.log("Error Occurred :", error);
        }
        console.log("Response Data :", body)

    }
);

上面的代码将给您以下答复:

{
   "ID":"CONV_DATA@IVA",
   "ApplicationName":"InterationsView",
   "Type":"FILT_DETAIL",
   "filters":[
      {
         "Name":"ChannelType",
         "Values":[
            "Phone",
            "Web-Chat",
            "Google-Assistant"
         ]
      },
      {
         "Name":"sessionType",
         "Values":[
            "nlu-voice",
            "nlu-text"
         ]
      },
      {
         "Name":"Direction",
         "Values":[
            "In"
         ]
      },
      {
         "Name":"Status",
         "Values":[
            "Complete",
            "Started"
         ]
      },
      {
         "Name":"statusReason",
         "Values":[
            "END"
         ]
      }
   ],
   "minDuration":9.7,
   "maxDuration":154.2,
   "minData":"2019-08-29T22:28:47.029UTC",
   "maxDate":"2019-08-29T22:28:49.578UTC"
}

与访问链接http://gentle-bastion-49098.herokuapp.com/api/filters

时在浏览器中看到的内容相同

如果您使用的是axios,则代码为:

const axios = require('axios');

apiUrl = "http://gentle-bastion-49098.herokuapp.com/api/filters"

axios.get(apiUrl)
    .then(function (response) {
        console.log("Response Data :", response.data);
    })
    .catch(function (error) {
        console.log("Error Occurred :", error);
    })

,它将给出与上述相同的响应。

即使您的书面代码也给予了回应:

Response Screenshot

答案 1 :(得分:0)

尝试以下更改:

 getFilterData().then(response => {
          console.log('filter', response.data)
 })
  .catch(err => {
          alert('Could not get filters ' + err.message.toString())
 })

在服务器代码中,使用res.send()将响应发送回客户端,如下所示:

 app.get('/api/filters', function(req, res) {
    let filtersResponse = {
        "ID": "CONV_DATA@IVA",
        "ApplicationName": "InterationsView",
        "Type": "FILT_DETAIL",
        "filters": [{
                "Name": "ChannelType",
                "Values": uniqueFilters.ChannelType,
            },
            {
                "Name": "sessionType",
                "Values": uniqueFilters.sessionType,
            },
            {
                "Name": "Direction",
                "Values": uniqueFilters.Direction,
            },
            {
                "Name": "Status",
                "Values": uniqueFilters.Status,
            },
            {
                "Name": "statusReason",
                "Values": uniqueFilters.statusReason,
            },
        ],
        "minDuration": uniqueFilters.minDuration,
        "maxDuration": uniqueFilters.maxDuration,
        "minData": "2019-08-29T22:28:47.029UTC",
        "maxDate": "2019-08-29T22:28:49.578UTC"
    };

    // Respond with filters
 res.send(
    filtersResponse
  )
 });