Dav*_*983 -6 express google-cloud-run
我在 Google Cloud Run 上有一个非常基本的快速服务,该服务已构建并部署到容器中。它的访问权限设置为允许未经身份验证。
我在前端使用 fetch 和 React 将数据发送到服务器并接收响应。
在服务器上,我似乎无法从我的请求正文中获取数据?无论我对标题等使用什么设置,我都无法从中获取任何数据。
我正在使用 fetch clientside 发送 POST 请求:
const sendData = async() => {
const response = await fetch('https://my-service.run.app', {
method: 'POST',
mode: 'no-cors',
body: { mydata: "some data"},
json: true
});
return response;
}
Run Code Online (Sandbox Code Playgroud)
在服务器上,我的服务超级简单。目前我想要的只是将 json 从客户端发送到云运行服务器,记录它,然后将相同的数据作为响应发送回客户端。但是,控制台日志总是给我一个空对象。
const express = require('express');
const app = express();
const bodyParser = require('body-parser');
const {Storage} = require('@google-cloud/storage');
const cors = require('cors');
const corsOptions = {
origin: true,
mode: 'no-cors',
optionsSuccessStatus: 200
};
const port = process.env.PORT || 8080;
app.use(bodyParser.json());
app.listen(port, () => {
console.log('Listening on port', port);
});
app.post('/', async (req, res) => {
try {
const corsMiddleware = cors(corsOptions);
return corsMiddleware(req, res, () => {
const servicedata = req.body;
console.log("MY DATA", servicedata )
res.send(srcontext);
});
}
catch (ex) {
console.log(`Error: ${ex}`);
}
})
Run Code Online (Sandbox Code Playgroud)
问题是你的第一个代码。在它的文档中node-fetch
提到,在制作 JSON POST 时,您应该添加headers: { 'Content-Type': 'application/json' }
代码中不存在的标头。
然后,你的代码应该是这样的
const sendData = async() => {
const response = await fetch('https://my-service.run.app', {
method: 'POST',
mode: 'no-cors',
body: JSON.stringify({ "mydata": "some data"}),
headers: { 'Content-Type': 'application/json' }
json: true
});
return response;
}
Run Code Online (Sandbox Code Playgroud)
该选项json:true
仅用于将响应解析为 json,而不是请求。
编辑
正如@sebastian-simon 建议的那样:
({ mydata: "some data" })
and({ "mydata": "some data" })
是等效的表达式并导致等效的对象。如果mydata
是字符串或符号变量,则({ [mydata]: "some data" })
需要使用。