You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

通过JavaScript调用远程Node.js服务无返回结果求助

Node.js Express服务请求挂起无响应问题

环境与代码

服务端运行在Linux服务器的8000端口,包含两个核心脚本:

index.js

const express=require("express")
const server_route=require("./routing")
const app=express()
const cors = require("cors");

app.use("/",cors, server_route);

app.listen(8000,()=>{
  console.log("Server is Running on the port 8000")
})

routing.js

var express = require('express');
var router = express.Router();

router.get('/startRoom?rname=.*&uname=.*', function(req, res, next) {
   console.log('Start Room');
   res.send('Start a Room');
   res.end();
});

router.get("/joinRoom?rname=.*&uname=.*",(req,res,next)=>{
   console.log('Join Room');
   res.send("Join room page");
   res.end();
})

router.get("/sendMesg?rid=.*&uid=.*&msg=.*",(req,res,next)=>{
   console.log('Send Mesg');
   res.send("Send Message page");
   res.end();
})

router.get("/*",(req,res,next)=>{
   console.log('Inv Page');
   res.send("Invalid page");
   res.end();
})

console.log( 'Router : ' + JSON.stringify(router) );

module.exports = router;

客户端调用代码

<script>
function createRoom( uname, rname ) {
   var xmlhttp = new XMLHttpRequest();

   xmlhttp.onreadystatechange = function() {
      console.log('readyState: ' + this.readyState);
      console.log('status: ' + this.status);
      console.log('responseText: ' + this.responseText);
      if (this.readyState == 4 && this.status == 200) {
         document.getElementById("room_content").innerHTML += this.responseText;
      }
   };

   var qurl = "http://10.0.0.94:8000/startRoom?rname=" + rname + '&uname=' + uname;
   console.log ('qUrl:' + qurl);
   xmlhttp.open("GET", qurl, true);
   xmlhttp.send();
}
</script>

测试代码

<script>createRoom('<?= $usr_name ?>','<?= $room_name ?>');</script>

问题现象

  • 调用createRoom后,浏览器无任何返回,控制台打印XMLHttpRequest状态:
    • 初始状态:readyState=1,status=0
    • 短暂延迟后:readyState=4,status=0
  • 直接在浏览器或curl访问请求URL也会挂起,无法获取预期的"Start a Room"响应

问题原因

  1. CORS中间件使用错误:app.use("/",cors, server_route)中直接传递了cors函数而非调用生成的中间件实例,导致请求处理流程卡住。
  2. 路由定义错误:Express路由仅匹配URL的路径部分,不包含查询参数,将?rname=.*&uname=.*写进路由路径会导致无法匹配实际请求,所有请求无法被正确路由处理。
  3. 冗余调用res.end():res.send()已自动结束响应,重复调用可能引发异常。

修复方案

1. 修正CORS中间件调用(index.js)

将app.use("/",cors, server_route);修改为:

app.use("/", cors(), server_route);

2. 修正路由定义(routing.js)

移除路由路径中的查询参数,通过req.query获取请求参数,并删除冗余的res.end():

var express = require('express');
var router = express.Router();

router.get('/startRoom', function(req, res, next) {
   const { rname, uname } = req.query;
   console.log('Start Room', rname, uname);
   res.send('Start a Room');
});

router.get("/joinRoom",(req,res,next)=>{
   const { rname, uname } = req.query;
   console.log('Join Room', rname, uname);
   res.send("Join room page");
})

router.get("/sendMesg",(req,res,next)=>{
   const { rid, uid, msg } = req.query;
   console.log('Send Mesg', rid, uid, msg);
   res.send("Send Message page");
})

router.get("/*",(req,res,next)=>{
   console.log('Inv Page');
   res.send("Invalid page");
})

console.log( 'Router initialized' );

module.exports = router;

修复后,请求可正常匹配对应路由,返回预期响应,跨域请求也能被正确处理。

内容的提问来源于stack exchange,提问作者TenG

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 14:25:23