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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 06:43:24