跨设备调用Node.js Express API时PUT请求失败求助
跨设备PUT请求失败的排查与修复方案
一、立即修复:客户端请求URL错误
另一台电脑的fetch代码里用了http://localhost:98/machines,localhost指的是发起请求的电脑本身,不是你的API服务器。必须把localhost换成API所在电脑的局域网IP(比如192.168.1.x,具体可以在服务器上用ipconfig或ifconfig查看)。
修改后的客户端代码:
fetch('http://192.168.1.xxx:98/machines', { // 替换xxx为API服务器的局域网IP method: 'PUT', headers: { 'Content-Type': 'application/json', 'Accept': '*/*' }, body: JSON.stringify(localStorageData) }) .then(response => { console.log(response); }) .catch(error => { console.error('Error:', error); });
二、API代码的两处错误修正
1. 条件判断的赋值错误
你写的if (req.body = {} || !req.body)是赋值操作(=),不是相等判断,这会导致永远触发418状态码,而且逻辑完全错误。改成判断空对象的正确写法:
if (!req.body || Object.keys(req.body).length === 0) { res.status(418).send({message:'We need a json'}) return }
2. 中间件与服务器启动顺序问题
app.listen()应该放在所有中间件和路由注册的最后,否则可能导致部分中间件(比如express.json())无法生效。同时express.json()必须在路由之前注册,才能正确解析PUT请求的JSON体。调整后的API代码:
const { getAllSoftware, updateMachines } = require('./services/db'); const express = require('express'); const cors = require('cors'); const app = express(); const PORT = 98; // CORS配置 const corsOptions = { origin: ['http://192.168.1.99:94', 'http://localhost:94'], }; // 先注册中间件 app.use(cors(corsOptions)); app.use(express.json()); // 解析JSON请求体,必须在路由前 // 注册PUT路由 app.put('/machines', async (req, res) => { console.log(req.body); if (!req.body || Object.keys(req.body).length === 0) { res.status(418).send({message:'We need a json'}) return } // 把req改成req.body并转成字符串,否则会显示[object Object] res.status(200).send({ machine: `dit is je machine met je json ${JSON.stringify(req.body)}` }) }); // 最后启动服务器 app.listen(PORT, () => console.log(`Server is running on port ${PORT}`));
三、额外注意点
- 确认客户端的
localStorageData:如果它已经是JSON字符串(比如从localStorage取出的"{}"),直接用body: localStorageData即可,不需要再JSON.stringify,否则会生成无效的JSON(""{}"")。 - 再次确认两台电脑在同一局域网,能互相ping通对方IP,服务器防火墙确实关闭或开放了98端口的入站规则。
内容的提问来源于stack exchange,提问作者ItsaMeEr
相关产品推荐
相关产品推荐

