微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

路由器处理程序返回一个对象数组,但客户端没有在 json 中获取它们,尽管响应状态为 200 不要显式设置状态使用res.json()

如何解决路由器处理程序返回一个对象数组,但客户端没有在 json 中获取它们,尽管响应状态为 200 不要显式设置状态使用res.json()

我正在使用 Typescript 实现一个 express.js 项目。

我已经定义了一个 enum一个 interface :

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 中的对象数组。

enter image description here

我想念什么?是不是express.js 不能自动解析enuminterface 到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 举报,一经查实,本站将立刻删除。