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
相关产品推荐
相关产品推荐

