Node.js问答类REST API使用VS Code Rest Client测试无响应求助
验证API是否正常运行的方法
- 启动服务后查看终端输出,确认服务启动成功无报错
- 在浏览器直接访问
http://localhost:3000/questions,如果能正常渲染页面,说明基础服务运行正常 - 新增测试路由验证基础响应:在server.js的路由配置段添加以下代码,访问
http://localhost:3000/test如果返回内容,说明服务本身没有问题,故障点在业务逻辑层
app.get('/test', (req, res) => res.send('服务正常'))
代码错误及修复方案
1. express.json中间件未正确调用
server.js中app.use(express.json);写法错误,express.json是中间件生成函数,必须加括号调用才会返回正确的中间件处理逻辑,否则请求会卡在解析阶段无响应。
修复:
app.use(express.json());
2. 请求路径错误
你当前请求的是http://localhost:3000/api,但你的问答路由是挂载在/questions前缀下的,实际API根路径应该是http://localhost:3000/questions/api,路径不匹配会走到404中间件,Rest Client请求时如果没有配置对应Accept头,会出现无响应的情况。
3. 模型导入错误
你的问题模型文件是question.js,但所有controller中导入模型的代码都写的是require('../models/subscriber'),导入了不存在的模型,导致数据库操作抛出未捕获异常,接口无响应。
修复: 所有controller中统一修改导入路径
const Question = require('../models/question');
4. 数据库操作混用async/await和回调函数
你在所有数据库操作接口中同时使用await和回调函数,mongoose的方法如果传入回调就不会返回Promise,await会失效,异常捕获逻辑也不会触发,导致请求挂起。
修复示例(get_questions接口): 统一使用async/await写法,删除回调
get_questions: async (req , res) => { try { const questions = await Question.find(); res.status(200).json({response : questions}) } catch (err) { res.status(400).json({response : err}); } }
其余get_question、create_question、delete_question、update_question接口都要按这个规则修改,不要混用回调和await。
5. 重复发送响应
get_question接口中你先调用了res.send("hello"),之后又调用res.status(200).json(...),同一个请求不能发送两次响应,会抛出错误导致接口异常。
修复: 删除res.send("hello")这行代码即可。
6. 服务启动无日志
当前代码启动服务时没有日志输出,你无法确认服务是否真的启动成功,修改mongoose连接成功后的回调逻辑:
mongoose.connect(dbURI, { useNewUrlParser: true, useUnifiedTopology: true }) .then(result => { const port = process.env.PORT || 3000 server.listen(port, () => { console.log(`服务运行在 http://localhost:${port}`) }) }) .catch(err => console.log('数据库连接失败:', err));
内容的提问来源于stack exchange,提问作者sara97

