客户端(fetch)和服务器(nodejs http)彼此不了解?

时间:2017-11-16 15:46:28

标签: javascript node.js

我现在试着围绕nodejs。

所以我创建了一个客户端:

let myHeaders = {
 'Content-Type': 'application/json',
 'Accept': 'application/json'
};

let myBody = {
  aString: "Test"
};

fetch("http://localhost:8099/", {
  method: 'post',
  mode: 'no-cors',
  headers: myHeaders,
  body: JSON.stringify(myBody)
})
.then(result => {
  return result.text();
})
.then(text => {
  // do stuff with text from server
});

我创建了一个服务器:

// request needed modules
const http = require('http');

// init server
let server = http.createServer(logic);
server.listen(8099);

// server logic
function logic (req, res) {
  var body = req.body;
  res.end("Hello");
}

两个问题:

1)服务器没有获取正文(req.body未定义)。

更新

请参阅下面的答案。

-

2)客户端没有收到“Hello”(result.text()返回“”)。

更新 2通过以下方式解决:

在客户端上更改此内容

fetch("http://localhost:8099/", {
  method: 'post',
  mode: 'no-cors', <-- CHANGE to: mode: 'cors'
...

在服务器上添加此内容

res.setHeader('Access-Control-Allow-Origin', '*');
res.setHeader('Access-Control-Allow-Headers', 'Content-Type');

-

我不知道我在这里做错了什么......

2 个答案:

答案 0 :(得分:0)

您的Node.js代码没有任何内容可以生成包含调用fetch的JS的HTML文档。

这意味着您必须发出跨源请求(这是您传递给fetch的绝对URL支持的。)

您还设置了mode: 'no-cors',这意味着“不要为尝试访问跨源资源而抛出安全性异常,并且不要让响应可用于JS”。

因此,当您尝试阅读回复时:您不能。

将模式设置为"cors"并将Node.js代码更改为follow the CORS specification,以授予试图读取数据的页面的权限。

  

我现在试着围绕nodejs。

这里没有Node.js的特别之处。这些问题与浏览器中运行的JavaScript可以执行的安全限制有关,除非HTTP服务器授予了权限。

答案 1 :(得分:0)

为了不完全弄乱我的问题,我将第一个问题的解决方案作为单独的答案发布:

解决方案 1)服务器没有获取正文(req.body未定义)

由于请求是一个流,我需要将其视为一个(通知&#34; req.on(&#39;数据&#39; ...)

这就是服务器按预期工作的方式:

// request needed modules
const http = require('http');

// init server
let server = http.createServer(handler);
server.listen(8099);

// server logic
function handler (req, res) {

  // Set CORS headers
  let headers = {
    'Access-Control-Allow-Origin' : '*',
    'Access-Control-Allow-Methods' : 'POST, OPTIONS',
    'Access-Control-Allow-Headers' : 'Content-Type, Accept'
  };
  res.writeHead(200, headers);

  if(req.method == 'POST'){

    var body = '';

    req.on('data', data => {
      body += JSON.parse(data).aString;
    });

    req.on('end', () => {

      res.end(body.toString().toUpperCase());
    });

  } else if (req.method == 'OPTIONS'){

    res.end();
  }

}