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

目前我试图围绕nodejs进行思考。

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

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 }); 

我已经创build了一个服务器:

 // 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是未定义的)。

UPDATE

看到我的答案在下面。

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'); 

我不明白我在这里做错了什么

你的Node.js代码没有任何东西会生成包含调用fetch的JS的HTML文档。

这意味着你必须做出一个跨源请求(这是由你传递的绝对URL支持)。

你也可以设置mode: 'no-cors' ,意思是“不要抛出一个安全exception,试图访问一个跨源资源,而不要让这个响应可用于JS”。

因此,当你尝试阅读回应:你不能。


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


目前我试图围绕nodejs进行思考。

这里没有什么特别的Node.js。 这些问题与安全限制有关,除非HTTP服务器授予许可,否则浏览器中运行的JavaScript可以执行哪些操作。

为了不完全搞砸我的问题,我作为单独的答案张贴我的解决scheme的第一个问题:

解决scheme 1)服务器没有得到正文(req.body未定义)

由于请求是一个stream,我需要像一个对待(注意“req.on('data'…)

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

 // 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(); } }