【问题标题】:FormData array.push not working to send to Mongodb & Mongoose CastError: Cast to Array failed for valueFormData array.push 无法发送到 Mongodb & Mongoose CastError: Cast to Array failed for value
【发布时间】:2019-02-17 04:48:19
【问题描述】:

我完全迷失了让一些 ajax 表单来工作我的案例场景我想使用一个表单来收集其数据并使用 Express 应用程序将其发布到 MongoDB,出于某种原因,我试图将一组网站传递给数据库,但由于某种原因,它以带引号的字符串形式出现,但它不接受对象数组。

我的代码:

$("#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: [],
...

我的问题:

  • 如果我 JSON.stringify 对象 sites:["{"site": "http://www.site1.com"},{"site":"http://www.site2.co.uk"}"].

  • 如果我将 siteObj 作为数据类型传递,它将返回 sites:["[object Object],[object Object]"] 作为字符串。

我在这里做错了什么?...提前感谢您的回复!

【问题讨论】:

    标签: javascript jquery node.js mongodb


    【解决方案1】:

    在做了一些更深入的研究并又用了 3 天的时间来解决这个无意义的问题后,我得出了一个解决方案:

    1. Mongoose 验证可以通过两种方式完成...

    ...
        sites: [{site: {type: String}}], ... or using a new mongoose Schema 
    
       const SiteUrls = mongoose.Schema({
        site:  {type: String}
       });
    
    **then...**
    
    sites: [SiteUrls]
    ...
    

    2。使用附加数组传输 FormData 的 Ajax 方法应如下例所示,否则您将面临来自 Mongoose 的验证错误“Cast to Array failed for value”...

    $("#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
    

    那么!!!

    3. Clients.js 路由器

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

    ??

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-21
      • 2021-01-07
      • 2017-03-23
      • 2015-08-10
      • 2017-08-14
      • 2017-02-06
      • 1970-01-01
      • 2022-08-23
      相关资源
      最近更新 更多