纯Node.js编写查询控制器时'response.status is not function'错误排查
解决Node.js中"response.status is not a function"错误
错误原因分析
- 原生Node.js的
http模块提供的response对象没有status()和json()方法,这两个方法是Express、Koa这类Web框架对原生对象的封装,直接使用原生API会报错。 - 路由判断逻辑错误:你写的
request === '/admins/all'是把整个请求对象和字符串做比较,永远不会成立,应该用request.url === '/admins/all'来匹配请求路径。 - 服务器代码中,调用
requestController后立刻执行response.end('Server Ready'),会提前终止响应,导致控制器里的响应逻辑无法正常执行。
修正后的控制器代码
const Admins = require('../models/admins') const Films = require('../models/films') const Categories = require('../models/categories') module.exports = function requestController(request, response) { // 修正路由判断:用request.url匹配路径 if (request.method === 'GET' && request.url === '/admins/all') { Admins.findAll() .then(data => { // 原生Node.js设置响应头并返回JSON response.writeHead(200, { 'Content-Type': 'application/json' }); response.end(JSON.stringify(data)); }) .catch(err => { response.writeHead(500, { 'Content-Type': 'application/json' }); response.end(JSON.stringify({ error: err.message })); }); } else { // 处理不匹配的请求 response.writeHead(400, { 'Content-Type': 'application/json' }); response.end(JSON.stringify({ message: '无效请求' })); } }
修正后的服务器代码
const db = require('./base'); const http = require('http'); const port = 3500; const Sequelize = require('sequelize'); const requestController = require('./controllers/main-controller'); http.createServer(function(request, response) { console.clear(); console.log('================================='); console.log('|| SERVER WORKED ||'); console.log('================================='); // 去掉提前执行的response.end,由控制器处理响应结束 requestController(request, response); }).listen(port);
内容的提问来源于stack exchange,提问作者SLIW
相关产品推荐
相关产品推荐

