Возникли проблемы с отправкой массива в качестве ответа API из Express во внешний интерфейс. Есть предложения?

#node.js #json #express #vue.js

#node.js #json #экспресс #vue.js

Вопрос:

Я новичок в Express / APIs, и я пытаюсь отправить массив объектов JSON с сервера на клиент…вот простой пример:

На стороне сервера (экспресс, файл маршрутизатора)

 router.get('/test', function(req, res, next) {
  var testData = ["{'field' : 'a'}", "{'field' : 'b'}", "{'field' : 'c'}"]
  console.log(testData)
  res.send(testData)
})
 

Сначала я строкую JSON, а затем объединяю их в массив перед отправкой ответа… теперь на стороне клиента…

На стороне клиента (Vue, getTest запускается кнопкой, и я пока просто проверяю журнал)

 methods : {
    getTest: async () => {
      let testData = await axios.get('http://localhost:3000/test',[])
      console.log(testData)
    }
  }
 

Здесь я извлекаю массив JSON из API и просто хочу увидеть их в консоли. Это возвращает только пустую строку следующим образом:

 {data: "", status: 200, statusText: "OK", headers: {…}, config: {…}, …}
 

Есть идеи? Прошу прощения, если я упускаю что-то основное.
Обратите внимание, что я не буду знать длину массива, который я отправляю из API заранее.

Ответ №1:

Первое, что вы можете сделать на стороне сервера, это использовать res.json() insted res.send() для ответа json

РЕДАКТИРОВАТЬ: здесь ссылка на документацию https://expressjs.com/fr/api.html#res.json

Ответ №2:

сначала вы можете сказать, что выдает каждый из этих «console.log», чтобы мы могли его отладить? Я поместил ваш API на свой собственный сервер express и получил этот ответ, который в порядке

 0   "{'field' : 'a'}"
1   "{'field' : 'b'}"
2   "{'field' : 'c'}"
 

и извлек его в моем приложении Vue и получил этот ответ:

     config: Object { url: "http://localhost:3000/test", method: "get", timeout: 0, … }
​
data: (3) […]
​​
0: "{'field' : 'a'}"
​​
1: "{'field' : 'b'}"
​​
2: "{'field' : 'c'}"
​​
length: 3
​​
<prototype>: Array []
​
headers: Object { "content-type": "application/json; charset=utf-8" }
​
request: XMLHttpRequest { readyState: 4, timeout: 0, withCredentials: false, … }
​
status: 200statusText: "OK"
 

итак, из того, что я вижу, в вашем коде все в порядке; Я не думаю, что вам нужно что-то менять в своем коде. это может быть связано с вашей конфигурацией, и, опять же, если вы сообщите нам, что регистрируют ваши приложения, мы можем обнаружить проблему.

Комментарии:

1. Большое вам спасибо за помощь в этом. Консоль на стороне сервера сообщает: ‘[ «{‘field’: ‘a’}», «{‘field’: ‘b’}», «{‘field’: ‘c’}» ] GET / test 200 3,749 мс — -‘ На стороне клиента это выглядит аналогичнов вашем журнале только поле данных является пустой строкой. конфигурация: {url: » localhost:3000 / test «, метод: «get», заголовки: {…}, transformRequest: Array(1), transformResponse: Array(1), …} данные: «» статус: 200 statusText: «OK»

2. Интересно, что когда я перехожу к localhost:3000 / test, я не вижу ошибок, но в ответ не отправляются данные. Просто пустой экран. Res.send(‘test’) отображает ‘test’ на этой странице, а Res.send({‘a’:’test’}) корректно отображает json. Но когда я делаю повторную отправку ([‘a’,’b’]) Я ничего не получаю в ответе.

3. Повозившись еще немного, я попробовал: res.send({‘b’: [‘a’] }) , который на самом деле отправляет что-то, но не то, что я ожидал. Log :::: {«b»:{«b»:»a»}} Но если я немного изменю его на res.send({‘whyisntthisworking’: [‘a’] }) , он больше не работает.

4. я вижу, что вы использовали здесь res.send(testData) , и я сделал то же самое в своем коде, который работал нормально, потому что вы отправляете переменную testData, которая представляет собой массив объектов. Я не понимаю, как ваш код может нормально работать со мной, но он не работает для вас. Я не могу придумать ничего, чтобы решить эту проблему. но просто знайте, что ваш код в порядке. Это должно быть в ваших экспресс-конфигурациях или что-то в этом роде.

Ответ №3:

Вы пытались изменить свой метод на интерфейсе таким образом?

 methods : {
    getTest: async () => {
      // use promise instead
      await axios.get('http://localhost:3000/test',[]).then((resp) => {
        let testData = resp.data
        console.log(testData)
      }).catch((err) => {
        console.log('oopss..')
      })
    }
  }