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

Node.js接口如何向TypeScript客户端返回多字段用户数据?

问题描述

我有一个Node.js的POST登录接口,原本仅返回token,现在希望同时返回token、用户邮箱、ID等信息,但实际返回内容里只有token。

后端Node.js接口代码

app.post('/auth', function (req, response) {
    const body = req.body;

    console.log(req.body);

    let query = `select * from users where email = "${req.body.email}" and password = "${req.body.password}"`;

    databaseConnector.query(query, (error, result) => {
        if (error) {
            console.log(error, 'Error occurred with /auth/ API...');
        }
        if (result.length > 0) {
            console.log(result);

            var token = jwt.sign({ userID: result.id }, 'todo-app-super-shared-secret', { expiresIn: '2h' });

            console.warn(token);

            response.send({
                token: token,
                email: result.Email,
                firstName: result.FirstName,
                Id: result.Id
            })
        }
        else {
            return response.sendStatus(401);
        }
    })
});

前端TypeScript请求代码

login(username: string, password: string): Observable<boolean> {
  return this.http.post<LoginClaim>(`${environment.baseURL}/auth`, { email: username, password: password })
    .pipe(
      map(result => {
        console.error(result);
        localStorage.setItem('access_token', result.Token);

        this.setLoginDetails(result.Token);
        return true;
      })
    );
}

期望与实际返回

  • 期望返回格式:
    {"token": "tokeeeeeeeeeeeeeeeeeen", "email": "example@email.com", "firstName": "John", "Id": 1234 }
    
  • 实际仅返回:
    {"token": "xxxxxxxxxxxx" }
    

自查代码未发现明显问题,请问可能遗漏了什么?


排查方向
  • 数据库查询结果结构错误
    数据库query方法返回的result是一个数组(你用result.length > 0判断有数据),用户数据是数组的第一个元素,直接用result.Email、result.Id取不到值,这些字段会因undefined被JSON序列化忽略,最终只有token有效。修正代码:

    if (result.length > 0) {
        const user = result[0]; // 取数组第一个元素
        var token = jwt.sign({ userID: user.id }, 'todo-app-super-shared-secret', { expiresIn: '2h' });
    
        response.send({
            token: token,
            email: user.Email,
            firstName: user.FirstName,
            Id: user.Id
        })
    }
    
  • 字段名大小写不匹配
    检查数据库表的字段名:如果数据库里存的是小写的email、id、firstname,用user.Email、user.FirstName会拿到undefined,同样会被序列化忽略。要保证代码里的字段名和数据库实际字段名完全一致。

  • 前端类型定义(次要)
    确认LoginClaim类型是否包含email、firstName、Id字段,如果类型里只有Token,TypeScript会在编译时限制你访问其他字段,但实际响应里是存在这些字段的(如果后端修复的话),不过这不会导致后端不返回内容。

  • 额外提示:SQL注入风险
    你的SQL查询用了字符串拼接,存在严重的SQL注入漏洞,建议改用参数化查询:

    let query = 'select * from users where email = ? and password = ?';
    databaseConnector.query(query, [req.body.email, req.body.password], (error, result) => {
        // 后续逻辑不变
    })
    

内容的提问来源于stack exchange,提问作者Vida

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 10:01:43