Node.js构建正常时间监控API时创建数据无响应问题求助
Node.js正常时间监控API创建数据无响应问题排查
问题核心原因
你的代码存在多个关键逻辑漏洞,导致请求无响应:
1. 未触发请求处理的回调函数
在userHandler.js中,你仅在合法请求方法的判断分支里定义了handler._users.POST处理函数,但从未调用这个函数,导致请求进入handler后完全停滞,既不执行后续逻辑,也不返回任何响应。同时,data.create成功/失败时仅打印日志,未调用callback向客户端返回结果。
2. 请求参数校验逻辑错误
phone字段校验判断typeof reqProps.body.phone === 'number',但前端传入的手机号通常是字符串类型,会直接判定为无效参数;- 参数校验失败时返回的提示字符串(如
'Type your name')会导致后续if (firstName && lastName...)的判断逻辑异常,明明参数无效却可能进入创建流程。
3. 响应头设置错误
handleReqRes.js中res.writeHead(status, headers)把请求头直接作为响应头传入,属于API用法错误,会导致响应异常。
4. 哈希函数的潜在风险
utilities.hash要求密码长度大于7,否则返回false,如果用户输入短密码,会导致存储的密码值为false,引发后续数据问题。
修复后的代码示例
修复userHandler.js
const { data } = require('../../lib/data'); const { hash } = require('../../helpers/utilities'); const handler = {}; handler.userHandler = (reqProps, callback) => { const acceptedMethods = ['GET', 'POST', 'PUT', 'DELETE']; // 提前定义所有请求方法的处理逻辑 const _users = { POST: (reqProps, callback) => { // 参数校验:用false标记无效值,而非提示字符串 const firstName = typeof reqProps.body.firstName === 'string' && reqProps.body.firstName.trim().length > 0 ? reqProps.body.firstName.trim() : false; const lastName = typeof reqProps.body.lastName === 'string' && reqProps.body.lastName.trim().length > 0 ? reqProps.body.lastName.trim() : false; // 修正手机号校验:适配前端传入的字符串类型 const phone = typeof reqProps.body.phone === 'string' && reqProps.body.phone.trim().length === 11 ? reqProps.body.phone.trim() : false; const password = typeof reqProps.body.password === 'string' && reqProps.body.password.trim().length > 0 ? reqProps.body.password.trim() : false; const tosAgree = typeof reqProps.body.tosAgree === 'boolean' ? reqProps.body.tosAgree : false; // 校验所有必填参数是否有效 if (firstName && lastName && password && phone && tosAgree) { const hashedPassword = hash(password); // 检查密码哈希是否成功 if (!hashedPassword) { return callback(400, { message: '密码长度必须大于7位' }); } // 检查用户是否已存在 data.read('users', phone, (err) => { if (err) { // 用户不存在,创建新用户 const userObject = { firstName, lastName, phone, password: hashedPassword, tosAgree, }; data.create('users', phone, userObject, (err) => { if (!err) { console.log('用户创建成功'); return callback(200, { message: '用户创建成功' }); } else { console.log(`创建失败: ${err.message}`); return callback(500, { message: '服务器内部错误,创建用户失败' }); } }); } else { // 用户已存在 return callback(409, { message: '该手机号已注册' }); } }); } else { return callback(400, { message: '请求参数错误,请检查必填字段' }); } } }; // 触发对应请求方法的处理逻辑 if (acceptedMethods.includes(reqProps.method)) { _users[reqProps.method](reqProps, callback); } else { callback(405, { message: '不支持的请求方法' }); } }; module.exports = handler;
修复handleReqRes.js的响应头部分
// ... 其他代码不变 chosenHandler(reqProps, (status, payload) => { status = typeof status === 'number' ? status : 500; payload = typeof payload === 'object' ? payload : {}; const payloadString = JSON.stringify(payload); console.log(`返回状态码: ${status}`); // 修正响应头设置 res.setHeader('Content-type', 'application/json'); res.writeHead(status); // 仅传入状态码,不要传请求头 res.end(payloadString); }); // ...
调试建议
- 在
chosenHandler调用前添加console.log(reqProps),确认请求方法、路径、参数是否正确; - 在
data.read和data.create的回调中打印err,确认文件读写操作是否正常; - 测试时确保请求头包含
Content-Type: application/json,请求体为合法JSON格式。
内容的提问来源于stack exchange,提问作者Ikram Ico
相关产品推荐
相关产品推荐

