基于Node.js MVC模式搭建Web服务器时Postman接口无响应问题求助
问题根因
- 混用了原生Node.js HTTP模块和路由框架的写法,逻辑冲突:
router.get()是路由注册方法,不是请求处理方法,放在每次请求的回调里不会生效,反而会重复注册路由 - 数据库查询是异步操作,你在异步回调执行前就调用了
res.end(),接口直接提前返回空内容 - 原生HTTP响应对象没有
res.send()方法,该方法是Express等Web框架封装的API,直接调用会报错导致响应中断
修复方案
方案1:改用Express框架(推荐,符合MVC开发习惯)
无需手写原生HTTP服务的路由判断,直接用Express框架简化实现:
- 先安装依赖:
npm install express - 替换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}`); });
- 调整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
相关产品推荐
相关产品推荐

