TypeError: ожидаемая строка, но полученная почтальон массива - PullRequest
0 голосов
/ 06 февраля 2019

Я пытался отправить данные формы, в которой есть несколько полей с одинаковым именем, я получаю сообщение "TypeError: ожидаемая строка, но полученный массив".

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

enter image description here

окончательные результаты массива

// this is from models/Battle

const mongoose = require('mongoose');
const Schema = mongoose.Schema;

// Create Schema
const BattleSchema = new Schema({
    user: {
        type: Schema.Types.ObjectId,
        ref: 'users'
    },
    date: {
        type: Date, 
        default: Date.now
    },
    category: {
        type: Number, 
        required: true // this will come from the selected category 
    },
    winner: {
        type: Number, 
        default: 0
    },
    status: {
        type: Number, 
        default: 0 // 0 means the battle is closed, 1 means the battle is open for votes, the status will stay 0 until all participants dropped
    },
    participants: [
        {
          participant: {
            type: Schema.Types.ObjectId,
            required: true
          }
        }
    ]
    
 

});

module.exports = Battle = mongoose.model('battles', BattleSchema);

//this is from routes/api/battles

// @route   POST api/battles
// @desc    Create battle
// @access  Private
router.post(
    '/create-battle',
    passport.authenticate('jwt', { session: false }),
    (req, res) => {
      const { errors, isValid } = validateBattleInput(req.body);
  
      // Check Validation
      if (!isValid) {
        // If any errors, send 400 with errors object
        return res.status(400).json(errors);
        console.log(errors);
      }

      const newBattle = new Battle({
         user: req.user.id,
         category: req.body.category,
         participant: req.body.participant
      });      

      //save
      newBattle.save().then(battle => {       

        // const participant = req.body.participant;
        const participant = req.body.participant;


        // add participants to array 
        battle.participants.push( participant );
        console.log(typeof req.body.participant);

        // get the inserted id  
        const battleId = battle._id;
        res.json(battle);      

      
      });
    }
);

// this is battle validation 
const Validator = require('validator');
const isEmpty = require('./is-empty');
var bodyParser = require('body-parser');

module.exports = function validateBattleInput(data) {
  let errors = {};

  data.category = !isEmpty(data.category) ? data.category : '';
  data.participant = !isEmpty(data.participant) ? data.participant : '';

  if (Validator.isEmpty(data.category)) {
    errors.category = 'Category field is required';
  }

  // if (Validator.isEmpty(data.challenger)) {
  //     errors.challenger = 'Challenger field is required';
  // }

  if (Validator.isEmpty(data.participant)) {
    errors.participant = 'Participant field is required';
  }

  return {
    errors,
    isValid: isEmpty(errors)
  };
};

Ответы [ 4 ]

0 голосов
/ 20 апреля 2019

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

0 голосов
/ 06 февраля 2019

Если вы хотите, чтобы данные отправлялись в массиве участников, все поля должны быть участниками, а не участниками

попробуйте отправить данные через необработанные данные и затем выбрать приложение / данные для лучшего форматирования

0 голосов
/ 20 апреля 2019

TypeError: Ожидаемая строка, но полученный массив.--- выдает ошибку как в почтальоне, так и в окне терминала.Я подозреваю, что это может быть несоответствие определения пользовательской схемы

Пожалуйста, проверьте пользовательскую схему вашей пользовательской модели, например, name: {type: String, required: true} она получает что-то другое, чем ожидалось.

0 голосов
/ 06 февраля 2019

попробуйте на вашей вкладке "body" выбрать "raw", а затем справа выберите "JSON (application / json)" вместо "text".

Я предполагаю, что ваша конечная точка APIиспользует JSON вместо данных формы в кодировке url, просто потому, что вы запускаете API, используя express и mongoose.но вы должны уточнить это на вопрос, если это не так.

Напишите правильное тело JSON, я имею в виду, используйте двойные кавычки для ключей, как в:

{"model": { "property": "value",  "property2": 1}}

и попробуйтес обертывающим объектом {"model": <YOUR BODY HERE>} или без, чтобы увидеть, что работает для вас, так как это типично для обертывания объекта, но иногда люди не используют их.(видя это в вашем коде: req.body.participant заставляет меня думать, что вы, вероятно, нет).

(PS: не связан с вопросом, но лично предпочитаю ARC или Insomnia для остальных клиентов, как интерфейс для нихчище)

...