如何解决路由器处理程序返回一个对象数组,但客户端没有在 json 中获取它们,尽管响应状态为 200 不要显式设置状态使用res.json()
我正在使用 Typescript 实现一个 express.js 项目。
export enum ProductType {
FOOD = 'food',CLOTH = 'cloth',TOOL = 'tool'
}
export interface MyProduct {
type: ProductType;
info: {
price: number;
date: Date;
};
}
我的一个路由器处理程序需要向客户端返回一个 MyProduct
数组。我试过这个:
const productArr: MyProduct[] = // call another service returns an array of MyProduct
app.get('/products',(req,res) => {
res.status(200).send({products: productArr});
});
我使用 Postman 测试了这个端点,它以状态 200 响应,但使用默认 HTML 页面而不是 JSON 中的对象数组。
我想念什么?是不是express.js 不能自动解析enum
和interface
到json 对象??
附言我已经设置了 json 解析器,所以与此无关,其他端点可以正常使用 json 响应:
const app = express();
app.use(express.json());
...
解决方法
正如评论中提到的,您的代码应该可以工作。我将列出一些可以用来尝试查找问题的步骤。
显示调试信息
在您的环境中设置 DEBUG=*
。 DEBUG
是一个环境变量,用于控制许多 Node 模块的日志记录。您将能够通过 Express 查看请求的流程。如果信息太多,您可以像这样限制输出:DEBUG=*,-babel,-babel:*,-nodemon,-nodemon:*,-router:layer,-follow-redirects,-send
(使用逗号分隔的列表并在您要排除的任何模块前放置一个 -
)
这应该可以帮助您通过各种路由器和路由跟踪请求的生命周期。您现在可以...
检查另一条使请求短路的路由
当 Express 路由发送对象时您看到一个 HTML 页面的事实可能表明您的请求正在匹配不同的路由。查找所有路由,例如出现在路由上方的非中间件 app.use()
或通配符路由。
其他建议
不要显式设置状态
添加 .status(200)
代码较多且不必要。
使用res.json()
使用 .json()
而不是 .send()
。 If 将始终添加 Content-Type: application/json
标头,而 .send()
在无法确定内容类型时不会添加(例如,.send(null)
或 .send('hello')
不会将 Content Type 标头设置为 {{ 1}},这可能会混淆客户端)。
由于缺乏完整的响应标头和服务器环境,假设您使用带有反向代理的 AWS 服务。因此,这里列出的可能性可能很少,需要考虑:
如果路由器处理程序返回一个对象数组,但客户端没有在 json 中获取它们,尽管响应状态为 200,那么可能有一个反向代理充当后端服务器,为未知提供状态代码为 200 的默认内容来自客户端的路由。因此,在这种情况下,您需要将反向代理服务器中的新路由列入白名单,假设您使用 AWS Amplify 进行 API 重写和重定向,那么您需要在您的 AWS amplify settings ,否则它将提供默认内容,就像在当前场景中发生的一样。
如果问题仍然存在,则:
-
确保您的服务器上有正确的 CORS 规范。
-
确保
productArr
是服务返回的数组,因为如果某些服务返回此值 - 它可能是未解决的承诺。因此,适当的测试用例将在这里帮助您或出于调试目的在您的环境中设置DEBUG=*
并确保它应按预期返回值。 -
检查使请求短路的另一条路由:当 Express 路由发送对象时您看到 HTML 页面这一事实可能表明您的请求匹配不同的路由。查找所有路由,例如非中间件 app.use() 或出现在路由上方的通配符路由。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。