почему массив возвращается в виде строки - PullRequest
2 голосов
/ 25 апреля 2019

компонент create.vue отправляет массив, в котором свойство данных chartLabels определяется как массив.

  data() {
    return {
      report: {
        licenseUsage: {
          chartLabels: [],
}
...

Схема Mongoose определяет тип данных как массив

const ReportSchema = Schema(
    {
      licenseUsage: {
        chartLabels: Array,
      },

API для создания отчета:

app.post("/api/create", (req, res) => {
  const report = new Report({
  licenseUsage: {
      chartLabels: req.body.licenseUsage.chartLabels,
}
...
});
  report.save(err => {
    if (err) return res.status(404).send({ message: err.message });

    return res.send({ report });
  });

запрос get с axios равен

    created: function() {
      this.getReport();
  },

    methods: {
    getReport() {
      axios.get("http://127.0.0.1:8000/api/report/" + this.$route.params.id).then(response => {
        this.report = response.data.report
        const { chartLabels } = response.data.report.licenseUsage
        this.chartLabels = chartLabels
        console.log(chartLabels)
      });
    },
    },

если я проверяю консоль, то форма поля ввода является массивом

enter image description here

, как только я нажимаю в формеи введите 3, 50, 56, 53, 3, 4 для проверки изменений консоли в строку

enter image description here

axios возвращает данные в виде строки в массиве

["3, 50, 56, 53, 3, 4", __ob__: Observer]
0: "3, 50, 56, 53, 3, 4"

почему я получаю массив из 1 строки?Я ожидаю получить массив из 6 элементов, как это.

Array(6)
0: 3
1: 50
2: 56
3: 53
4: 3
5: 4

спасибо за любую помощь

- отредактируйте

, если массив жестко запрограммирован, а не определен как пустой массив, как, например, он работает с массивом из 6 элементов

chartLabels: [3, 50, 56, 53, 3, 4]

Может быть, вопрос в том, как вернуть массив из одного поля ввода формы?

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

это потому, что вы даете это строку значение при вводе формы [cit .:] "и вводите 3, 50, 56, 53, 3, 4".

Все входные данные по умолчанию строк , если не указано иное, и это должно быть сделано явно!

В более ранних, чем HTML 5, строковый тип данных был все, что вы можете поместить / получить. Теперь среди многих других новых свойств ввода вы можете иметь: <input type="number">, но нет такой вещи, как input type = "array".

Итак, вместо этого вам нужно преобразовать ваши входные данные в объект array , прежде чем передавать их монстру. Самый простой способ сделать это:

"3, 50, 56, 53, 3, 4".split(",");
>> [ 3, 50, 56, 53, 3, 4 ]
//WARNING: each 'number' will be a string of course!
0 голосов
/ 30 апреля 2019

для любого, кто может найти это @ window.document & @apple apple, был ответ - вопрос был в том, где разделить, прежде чем кормить монстра..Split идет в API так.Теперь возвращает массивы в виде строк или чисел при создании.

app.post("/api/create", (req, res) => {
  const report = new Report({
    month: req.body.month,
    licenseUsage: {
      chartLabels: req.body.licenseUsage.chartLabels.split(','),
      nyRevit: req.body.licenseUsage.nyRevit.split(',').map(Number)
    }

, но НЕ работает в обновлении - ошибка .spit не является функцией, потому что массив возвращается не строка - пока чтокогда обновление сохранено, оно превращается обратно в строку.Чтобы исправить это, вы должны сначала добавить .toString

app.put("/api/report/update/:id", (req, res) => {
  Report.findByIdAndUpdate(
    req.params.id,
  { $set: 
    {
     licenseUsage: {
          chartLabels: req.body.licenseUsage.chartLabels.toString.split(','),
          nyRevit: req.body.licenseUsage.nyRevit.toString.split(',').map(Number)
        }
0 голосов
/ 26 апреля 2019

Попробуйте JSON.decode () ваш ответ

...