我现在试着围绕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');
-
我不知道我在这里做错了什么......
答案 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();
}
}