客户端(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(); } }