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

基于Node.js MVC模式搭建Web服务器时Postman接口无响应问题求助

问题根因

  • 混用了原生Node.js HTTP模块和路由框架的写法,逻辑冲突:router.get()是路由注册方法,不是请求处理方法,放在每次请求的回调里不会生效,反而会重复注册路由
  • 数据库查询是异步操作,你在异步回调执行前就调用了res.end(),接口直接提前返回空内容
  • 原生HTTP响应对象没有res.send()方法,该方法是Express等Web框架封装的API,直接调用会报错导致响应中断

修复方案

方案1:改用Express框架(推荐,符合MVC开发习惯)

无需手写原生HTTP服务的路由判断,直接用Express框架简化实现:

  1. 先安装依赖:npm install express
  2. 替换index.js代码:
const express = require('express');
const app = express();
const airController = require('./airController'); // 替换为你实际的文件路径
const port = 3000; // 替换为你要监听的端口

// 注册路由
app.get('/airMonitoring', airController.getAllData);

app.listen(port, () => {
  console.log(`服务运行在端口${port}`);
});
  1. 调整airController的错误处理逻辑,避免语法隐患:
exports.getAllData = (req, res)=> {
  AirModel.getAllData((err, airMonitoring) =>{
    if(err) {
      // 附加错误状态码方便调用端识别
      return res.status(500).json(err);
    }
    console.log('data', airMonitoring);
    res.json(airMonitoring);
  })
}

方案2:坚持使用原生HTTP模块的修改方式

如果不想引入框架,删掉路由框架的调用,把逻辑直接写到HTTP回调里,等异步操作完成再结束响应:

const server = http.createServer(function(req, res) {
  console.log("http was created!");
  if(req.url == '/airMonitoring' && req.method === 'GET'){
    res.writeHead(200, { 'Content-Type': 'application/json' });
    AirModel.getAllData((err, airMonitoring) =>{
      if(err){
        // 把错误转成JSON字符串返回
        res.end(JSON.stringify(err));
        return;
      }
      console.log('data', airMonitoring);
      // 异步查询完成后再结束响应
      res.end(JSON.stringify(airMonitoring));
    })
    // 不要在这里写res.end(),否则异步逻辑还没执行就返回了
  } else {
    res.writeHead(404, { 'Content-Type': 'application/json' });
    res.end(JSON.stringify({msg: '接口不存在'}));
  }
});
// 记得调用listen启动服务
server.listen(3000, () => console.log('服务启动在3000端口'));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 02:24:02