无法使用 fetch API 请求带有 HTML 页面的 localhost 节点服务器

Posted

技术标签:

【中文标题】无法使用 fetch API 请求带有 HTML 页面的 localhost 节点服务器【英文标题】:Cannot able to request the localhost node server with HTML page using fetch API 【发布时间】:2021-04-18 16:09:48 【问题描述】:

说明:

我正在尝试使用 Fetch API 将 JSON 数据从 html 页面发送到在端口 5000 上本地运行的 Node.js 服务器。

出现错误:

CORS 策略已阻止从源“http://127.0.0.1:5501”获取“http://localhost:5000/attend”的访问权限:对预检请求的响应未通过访问控制检查:请求的资源上不存在“Access-Control-Allow-Origin”标头。如果不透明的响应满足您的需求,请将请求的模式设置为“no-cors”以获取禁用 CORS 的资源。

端口错误:

POST http://localhost:5000/attend net::ERR_FAILED

获取错误:

Uncaught (in promise) TypeError: Failed to fetch

Code Error Image

Node.js 代码:

  connectdb();
    const app = express();
    
    app.use(express.static('public'));
    app.use(express.json(extended: false));
    app.use (bodyParser.json());
    
    
    app.get('/',(req,res)=> res.send('API RUNNING'));
    
    app.post('/attend',async (req,res)=>
        const name,rollnumber = req.body;
        console.log(name);
        console.log(rollnumber);
        try 
            let data = await Database.findOne( rollnumber );
            if (data) 
                return res
                  .status(400)
                  .json( errors: [ msg: 'attandence is marked all ready' ] );
              
              const  Data = new Database(
                rollnumber,
                name
              );
              await Data.save();
              res.json("added success fully");
         catch (err) 
            console.error(err.message);
            res.status(500).send('Server Error');
        
    );

HTML 代码:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Marked</title>
    <link rel="stylesheet" href="/Client/style.css">
    <script>

     function attend()
      const data = 
        name:'Syed Ali Shahzil',
        rollnumber:'180996'  
    ;
    const options = 
      method:'POST',
      headers:
        'Content-Type' : 'application/json;charset=UTF-8'
      ,
      body: JSON.stringify(data)
    ;
    fetch('http://localhost:5000/attend',options);  
    
 
  
  
    </script>
</head>
<body>
    <div>
        <ul>
            <li><a  href="/">Home</a></li>
            <li><a class="active" href="marked.html">attendence Marked</a></li>
           
          </ul>
          <button class="button" onclick="attend()"> Present</button>
        </div>
</body>
</html>

【问题讨论】:

只是为了添加一些上下文来为什么会发生这种情况:这个 CORS 错误是意料之中的,因为您的源域 (http://127.0.0.1:5501) 与您的目标域不匹配 ( http://localhost:5000)。是的,127.0.0.1localhost 是同义词,但即使端口号不同也会触发错误。见:Same Origin Policy 【参考方案1】:

请在你的包中安装cors

$ npm install cors

并在您的应用中使用它

// Import cors
const cors = require("cors");
const app = express();

// Add it in the middleware
app.use(cors())
... Rest of your code

之后您的请求将正常工作。

【讨论】:

以上是关于无法使用 fetch API 请求带有 HTML 页面的 localhost 节点服务器的主要内容,如果未能解决你的问题,请参考以下文章

使用 fetch api 调用带有 keepalive 的 POST 请求时,预检请求失败

如何使用 Angular 发送带有对象参数的 fetch api 请求?

如何在带有 Jest 的 react-native 中使用模拟的 fetch() 对 API 调用进行单元测试

Fetch API 无法加载 URL 方案对于 CORS 请求必须是“http”或“https”

错误:使用 Fetch API 向第三方 API 发出 GET 请求时出现“TypeError:无法获取”

Javascript fetch 无法从 GMail API Batch 请求中读取 Multipart 响应