Javascript 如何通过XMLhttprequest向我自己的节点服务器发送一篇文章?

Javascript 如何通过XMLhttprequest向我自己的节点服务器发送一篇文章?,javascript,json,ajax,node.js,Javascript,Json,Ajax,Node.js,我试图通过XMLhttprequest将数据发送到节点。数据如下所示(/q/zmw:95632.1.9999.json)。我与节点的连接是正确的,但是,我得到的是一个空对象,所以我将标题设置为Content-Type-application/json,然后对数据进行字符串化。然而,节点给了我一个意外的标记“错误。我认为这是因为字符串,但是,如果我不字符串化数据,那么它会因为/“在数据中。如何使用纯Javascript正确发送数据。我想远离axios和jquery,因为我想更加精通普通javasc

我试图通过XMLhttprequest将数据发送到节点。数据如下所示(/q/zmw:95632.1.9999.json)。我与节点的连接是正确的,但是,我得到的是一个空对象,所以我将标题设置为Content-Type-application/json,然后对数据进行字符串化。然而,节点给了我一个意外的标记“错误。我认为这是因为字符串,但是,如果我不字符串化数据,那么它会因为/“在数据中。如何使用纯Javascript正确发送数据。我想远离axios和jquery,因为我想更加精通普通javascript。我将通过组合url前缀和后缀对节点中的api进行最后调用

这是我的密码:

function getCityForecast(e){

     //User selects option data from an early JSONP request.
     var id = document.getElementById('cities');
     var getValue = id.options[id.selectedIndex].value;

     //Assembles the suffix for http request that I will do in Node.
     var suffix = getValue + ".json";
     var string = JSON.stringify(suffix);

     console.log(suffix);

     var xhr = new XMLHttpRequest();

     xhr.open("POST", "http://localhost:3000/", true);
     xhr.setRequestHeader("Content-Type", "application/json;charset=UTF-8");
     xhr.send(string);
}
Node.js代码:

 var express = require('express');
 var app = express();
 var bodyParser = require('body-parser');
 var path = require('path');
 var request = require('request');
 var http = require('http');

 // ****************** Middle Ware *******************
 app.use(bodyParser.urlencoded({ extended: true }));
 app.use(bodyParser.json());

 app.use(express.static(__dirname + '/public'));

 app.post('/', function(req, res){
    console.log('working');

    console.log(req.body);
 });

 app.listen(3000, function() { console.log('listening')});

目前,这对我很有效。我正在使用的RESTAPI需要一个令牌。您的可能没有,或者它可能正在寻找其他自定义标题。阅读API的文档。注意,您可能需要一个多边形填充/垫片来实现跨浏览器的平滑度(承诺)。我正在做GET,但这也适用于POST。您可能需要传递一个对象。如果要传递凭据以获取令牌,请不要忘记
window.btoa
。可以这样说:

httpReq('GET', device.address, path, device.token).then(function(data) {
  //console.log(data);
  updateInstrument(deviceId,path,data);
}, function(status) {
  console.log(status);
});


  function httpReq(method, host, path, token) {
    if(method === "DELETE" || method === "GET"|| method === "POST" || method === "PUT" ){
      var address = 'https://' + host + path;
      return new Promise(function(resolve, reject) {
        var xhr = new XMLHttpRequest();
        xhr.open(method, address, true);
        xhr.setRequestHeader("Accept", "application/json");
        xhr.setRequestHeader ("X-auth-token", token);
        //xhr.setRequestHeader ("Content-Type", "application/x-www-form-urlencoded");
        xhr.onload = function() {
          var status = xhr.status;
          if (status == 200 || status == 201 || status == 202) {
            resolve(xhr.response);
          }
          // this is where we catch 404s and alert what guage or resource failed to respond
          else {
            reject(status);
          }
        };
        xhr.send();
      });
    } else {
      console.log('invalid method');
    }
  };

我发现这是我的错误,这是我的问题。我试图发送一个字符串而不是一个对象。所以它不是像这样合适的JSON:

   var string = JSON.stringify(suffix);
为了纠正这种情况,我补充说:

var newObj = JSON.stringify({link : suffix});

这使我的帖子成功了,因为我现在发送了一个对象,因此使用了单词Javascript对象表示法。

请参阅
FormData
对象,以便为帖子请求以正确的格式放置数据:或者只使用
XMLHttpRequest
查看:看起来它将成功创建一个包含文件名的字符串,JSON对其进行编码,然后使用正确的HTTP头将其发送到服务器。我不知道您试图发送的数据是什么,而且您还没有共享服务器端代码,这就是错误的来源。您的问题非常不清楚。您没有向Node.js发送请求,而是将其发送到HTTP服务器,请求并不关心该服务器是Node、java、go服务器还是反向代理。@Quentin非常感谢您的提问。我忘了实际创建一个要字符串化的对象。当你说“创建一个包含文件名的字符串”时,我意识到我只是在创建一个字符串,而不是一个对象。