2016-09-28 21 views
0

我正在创建一个投票应用程序,我遇到了一个问题,我不知道如何解决。我认为我刚刚构造了我的应用程序。我有一个像这样同时向同一路由发出两个不同的POST请求

app.route('/poll-create') 
     .post(function(req, res) { 
      var userID; //variable to store the authentication id for the user 
      var incoming_id = Object.keys(req.body)[0]; 

      console.log(incoming_id); 

      serverHandler.newPoll(req, res, db, function(id) { 
       user_id = id; 
      }); 

      res.redirect('/new-poll'); 


     }); 

我传递某种形式的数据,这条路线,像这样从HTML

<form action='' method='post' enctype='multipart/form-data' name='new-poll-form'> 
        <div class='form-group'> 
         <label>Title</label> 
         <input type='text' name='title' class='form-control' placeholder='Title' /> 
        </div> 
        <div class='form-group'> 
         <label>Options</label> 
         <textarea class="form-control poll-options" rows="5" placeholder='Options' name='options'></textarea> 
        </div> 
        <button type='submit' class='btn btn-primary submit-butt'>Submit</button> 
        </form> 

在表单中输入的数据直接发送到路线没有一个POST路线我需要一个AJAX请求。我认为这是因为我在表单中设置了method ='post'。

现在,我的问题是,我还需要传入链接到上述HTML文件的JavaScript文件中的对象。我做的是通过AJAX调用像这样

$('.submit-butt').on('click', function() { 
         console.log('From in here'); 
         ajaxFunctions.ready(ajaxFunctions.ajaxRequest('POST', appUrl + '/poll-create', response.authResponse.userID, function(data) { 

         })); 
        }); 

这里是低于

'use strict'; 
var appUrl = window.location.origin; 

var ajaxFunctions = { 
    ready: function ready (fn) { 
     if (typeof fn !== 'function') { 
     return; 
     } 

     if (document.readyState === 'complete') { 
     return fn(); 
     } 

     document.addEventListener('DOMContentLoaded', fn, false); 
    }, 
    ajaxRequest: function ajaxRequest (method, url, data, callback) { 
     var xmlhttp = new XMLHttpRequest(); 
     console.log('Inside ajaxRequest'); 
     console.log(data); 

     xmlhttp.onreadystatechange = function() { 
     if (xmlhttp.readyState === 4 && xmlhttp.status === 200) { 
      callback(xmlhttp.response); 
     } 
     }; 

     xmlhttp.open(method, url, true); 
     xmlhttp.setRequestHeader('Content-type', 'application/x-www-form-urlencoded'); 
     xmlhttp.send(data); 
    } 
}; 

所以AJAX功能,我面对的第一个问题是,当我尝试CONSOLE.LOG通过发送的数据AJAX请求(假设我发送一个对象),我得到的输出是{'object Object':''}。这就是为什么我选择仅从该对象发送用户ID的原因。在这种情况下,我得到这个{'userID':''}。它很烦人,但我至少可以用它工作。

我的第二个问题是,即使我用我的方式解决第一个问题,我实质上是对相同的路由进行两个AJAX调用。所以,我无法同时访问表单数据和用户标识。所以,我不能将它们插入到单个文档中。我如何解决这个问题?有没有更好的方式来传递数据比我目前做的更好?请帮忙! 我正在使用身体分析器来解析传入的数据和强大的解析传入的表单数据。

+0

对于第一个问题,使用的console.log(JSON.stringify(对象)),以对象转换为可读的JSON。 – vlatkokaplan

+0

你从哪里得到response.authResponse.userId?这是否取决于第一次通话? – mimarcel

+0

@vlatkokaplan - 那不行。当我尝试时,它返回{“object Object”:“”},这是我刚才处理的完全相同问题的JSON表示。 –

回答

1

您应该只有一个这样的请求:

$('.submit-butt').on('click', function() { 
    var formData = {}; // Prepare form data. 

    // Add code to get form data as json and insert it in formData 
    // You can either use Javascript for this or, with jQuery you can look into https://api.jquery.com/serializeArray/. 

    formData.userId = response.authResponse.userID; // This is how you add new data. 

    // Make ajax request with formData. 

    return false; // It is important to return false so the normal form POST request will not trigger, since you already did all that job with Ajax. 
}); 
+0

这听起来像它会工作,除了我的第二个问题,这是每次我通过一个AJAX请求传递一个对象,并尝试控制台。记录在路由中,我以{'object Object':''}的形式得到它,当我实现你的解决方案时,同样的事情会发生。我如何解决这个问题? –

+0

另一个问题,因为我通过jquery收集表单数据手动提交表单数据,它仍然会作为多部分数据发送?因为如果是这样,req.body数据是否可以通过使用body-parser访问?由于body解析器文档提到它不能处理多部分数据? –

+0

好吧,我试过你的方法,它迄今为止工作。我只需要改变很多微小的小函数就可以使它像早期工作一样工作。希望不应该太糟糕。谢谢你的帮助! –

1

最简单的事情可能是一次发送所有内容(除非您明显不知道的ID)。您可以使用表单或使用AJAX来完成此操作。你可以使用像jQuery这样的东西来收集表单数据,或者甚至只是一个简单的函数,在将数据作为JSON发送之前将数据从表单中提取出来。

+0

对,这就是我的问题。我将不得不第二个AJAX调用ID的权利?这将打败我自己发送一切的全部目的。我仍然需要为该ID创建第二个AJAX调用,并且我不会与表单数据同时获得该调用。 –

+0

如果你需要客户端上的id,那么你需要AJAX或页面刷新。我只是想,也许你可以在创建记录后在服务器上完成第二步。 –

+0

不确定这将工作,因为我的Facebook SDK是一个客户端功能,这就是返回对象到我的服务器。所以,我不知道如何直接从服务器端访问。 –

相关问题