NodeJS:如何使用FormData执行Ajax Post

时间:2017-09-13 10:19:58

标签: javascript jquery node.js ajax post

我正在测试一个本地HTML表单,将数据作为后端发送到aspx应用程序。由于我在CORS上有一些问题(甚至在localhost上)我试图模仿jQuery用NodeJS执行的Ajax请求。我不知道这是否是正确的做法。在HTML表单中,在jQuery验证之后,这就是我所做的:

submitHandler: function(form) {
    $.ajax({
        url: form.action,
        type: form.method,
        data: $(form).serialize(),
        success: function(response) {
            console.log(response);
        }            
    });
    //console.log($(form).serialize())
}

并且它可以工作,直到CORS结束请求。我的意思是我可以从后端应用程序中检索数据。 相反,如果我这样做:

function loadDoc() {    

  var XMLHttpRequest = require("xmlhttprequest").XMLHttpRequest;
  var xhttp = new XMLHttpRequest();

  /*var FormData = require('form-data');
  var myform = new FormData();
  myform.append('firstname', 'foo');*/

  xhttp.onreadystatechange = function() {
   if (this.readyState == 4 && this.status == 200) {
    console.log(this.responseText);
   }
  };
  xhttp.open("POST", "http://127.0.0.1:1308/ImperoOrdini/ImperoOrdini.aspx?CMD=NUOVOORDINE", true);

  //which is the same string I get from .serialize() in jQuery
  xhttp.send("firstname=foo&email=some@domain.it");
}

loadDoc();

我无法从服务器应用程序中获取任何内容。如果我想从POST数据中获取参数firstname,我会得到null。那么,我哪里错了?

更新 This是我发现在NodeJS中唯一有用的解决方法:

var http = require('http');

var querystring = require('querystring');
var post_data = querystring.stringify({'firstname':'Lory'});

var post_options = {
  host: 'localhost',
  port: '1308',
  path: '/ImperoOrdini/ImperoOrdini.aspx?CMD=NUOVOORDINE',
  method: 'POST',
  headers: {
      'Content-Type': 'application/x-www-form-urlencoded',
      'Content-Length': Buffer.byteLength(post_data)
  }
};

// Set up the request
var post_req = http.request(post_options, function(res) {
  res.setEncoding('utf8');
  res.on('data', function (chunk) {
      console.log('Response: ' + chunk);
  });
});

// post the data
post_req.write(post_data);
post_req.end();

我也尝试过:

var request = require('ajax-request');
request.post({
  url: 'http://127.0.0.1:1308/ImperoOrdini/ImperoOrdini.aspx?CMD=NUOVOORDINE',
  data: {'firstname':'Lory'},
  headers: {}
  }, function(err, res, body) {
     console.log(res);
   }
);

但它也没有用。我觉得这么无知,我想知道这3个图书馆之间的差异。 关于我必须在工作解决方案中使用querystring.stringify()的事实,我有一些疑问,因为如果我记得很清楚,POST数据不在URL中,并且不应该是查询字符串的限制。

2 个答案:

答案 0 :(得分:1)

我想建议request模块。在做ajax调用时,我们可以通过表单或JSON格式发布数据。它基于接收端的接收点。

我希望您尝试发布表单数据。

 var request = require('request');
 request.post({
    url:'http://service.com/upload', 
    form: {'firstname':'Lory'}
  }, function(err,httpResponse,body){ 
     /* ... */ 
  })

如果您正在尝试正常的JSON帖子。

var request = require('request')
request({
     method: 'POST',
     uri: 'http://www.google.com',
     body:{'firstname':'Lory'}
}, function(err,httpResponse,body){ 
     /* ... */ 
})

request模块提供了很多选项。玩那个然后你会得到更好的主意。

答案 1 :(得分:1)

    <html>
    <head>

       <script src="https://code.jquery.com/jquery-2.2.4.min.js" integrity="sha256-BbhdlvQf/xTY9gja0Dq3HiwQF8LaCRTXxZKRutelT44="
            crossorigin="anonymous"></script>
    </head>
    <body>     
    <form id="myForm" name="myForm">
                            <div>
                              <label for="comment">Comment:</label>
                              <textarea id="comment" name="comment"></textarea>
                            </div>
                           <div>
                              <label for="rating">Comment:</label>
                              <textarea id="rating" name="comment"></textarea>
                            </div>

                          <input type="submit" value="Submit!">
         </form>

        <script>

        $(document).ready(function () {
           $('form').submit(function (event) {
                        event.preventDefault();
                  //collect the form data using Id Selector what ever data you need to send to server
                        let comment=$('#comment').val();
                        let rating= $('#rating').val()

                        $.ajax({
                            url: 'replace your url',
                            data: JSON.stringify({"comment": comment, "rating": rating }),
                            processData: false,
                            type: 'POST',
                            contentType: 'application/json',
                            success: function (data) {
                                alert(data);
                            }
                        });


                    });
                })


    </script>
    </html>