通过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"响应
问题原因
- CORS中间件使用错误:
app.use("/",cors, server_route)中直接传递了cors函数而非调用生成的中间件实例,导致请求处理流程卡住。 - 路由定义错误:Express路由仅匹配URL的路径部分,不包含查询参数,将
?rname=.*&uname=.*写进路由路径会导致无法匹配实际请求,所有请求无法被正确路由处理。 - 冗余调用
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
相关产品推荐
相关产品推荐

