FormData array.push не работает для отправки в Mongodb и Mongoose CastError: преобразование в массив завершилось неудачно для значения - PullRequest
0 голосов
/ 12 сентября 2018

Я полностью потерян, чтобы получить какую-то форму ajax для работы в моем случае. Я хочу использовать форму для сбора своих данных и отправки их в MongoDB с помощью приложения Express, по какой-то причине я пытаюсь передать массив сайтов в БД, но по какой-то причине она представляет собой строку с кавычками, но не принимает массив объектов.

Мой код:

$("#createClients").submit(function(e) {
  e.preventDefault();

  var formData = new FormData(this);
  var siteArr = [];
  $(".site").each(function(){
    var siteUrl = $(this).val();
    var siteObj = {
      "site": siteUrl
    };
    siteArr.push(siteObj);// if I use stringify it returns 2 strings with 2 objects
  });//building array of sites from inputs

  console.log("Sites Array", siteArr);//Here the array looks right and returns all objects from the inteneration

  formData.append('sites', siteArr);

  // here I am appending it to the response but it returns like ["{"site":"site.com"},{"site":"site.com"}"]
  // for some reason its generating quotes for the objects just like a string !!?!?!?

  $.ajax({
    url: "/clients/create",
    type: "POST",
    connection: "keep-alive",
    cache: false,
    contentType: false,
    processData: false,
    data: formData,
    success: function (data) {
      console.log(data);
    },
    error: function (err) {
      console.log(err);
    }
  });
});// posts new Clients

Моя модель Мангуст:

...
    sites: [],
...

Мои проблемы:

  • siteObj возвращается из formData () с кавычками, если я JSON.stringify объект sites: ["{" site ":" http://www.site1.com"},{"site":" http://www.site2.co.uk"}"].

  • Если я передам siteObj в качестве типа данных, он возвращает sites: ["[Object Object], [object Object]"] в виде строки.

Что я тут не так делаю? ... Заранее спасибо за ваш ответ!

1 Ответ

0 голосов
/ 18 сентября 2018

Проведя более глубокое исследование и еще 3 дня, пытаясь решить эту бессмысленную проблему, я пришел к решению:

1.Проверка Mongoose может быть выполнена двумя способами ...

...
    sites: [{site: {type: String}}], ... or using a new mongoose Schema 

   const SiteUrls = mongoose.Schema({
    site:  {type: String}
   });

**then...**

sites: [SiteUrls]
...

2.Метод Ajax для передачи FormData с добавленным массивом должен выглядеть как в примере ниже, иначе вы столкнетесь с ошибкой проверки от Mongoose «Преобразовать в массив не удалось для значения» ...

$("#createClients").submit(function (e) {
    e.preventDefault();

var formData = new FormData(this);
var siteArr = [];

$(".site").each(function() {
  var siteUrl = $(this).val();
  siteArr.push({'site':siteUrl});
}); //building array of sites from inputs

console.log("Sites Array", JSON.stringify(siteArr)); 

formData.append('sites', JSON.stringify(siteArr));// SEND the array as string otherwise it will send [object object] as the string... this should build a response like [{"url":"site.com"},{"url":"site2.co.uk"}]... follow clients.js file use JSON.parse(req.body.sites); to turn it into a parsed object like so [{url:"site.com"},{url:"site2.co.uk"}]

$.ajax({
  url: "/clients/create",
  type: "POST",
  connection: "keep-alive",
  contentType: false,
  cache: false,
  processData: false,
  data:  formData,
  success: function (data) {
    console.log(data);
  },
  error: function(err) {
    console.log(err);
  }
});


}); // posts new Clients

THEN !!!

3.Clients.js Router

...
sites: JSON.parse(req.body.sites), // turn it into a parsable array so data is validated by mongoose and sent to DB
...

??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...