【问题标题】:How to know the object type from a json with Node JS如何使用 Node JS 从 json 中了解对象类型
【发布时间】:2019-12-06 15:41:40
【问题描述】:

我有一个具有灵活端点的 Node JS Express API。该端点将从请求正文接收 JSON,并且它应该知道它所属的匹配对象。

例如 1:

POST /api
{
   "id": 1,
   "username": "felipe"
}

上面的json应该是User对象。

例如 2:

POST /api
{
   "price": 15.5,
   "description": "Product description"
}

上面的json应该是Product对象。

如何动态知道我从请求中收到的对象类型?是否有任何类型的 os 架构或其他我可以使用的概念?

【问题讨论】:

  • 您必须在 JSON 正文中显式编码所需的对象类型。 JSON 本质上没有“类型”特性。
  • 我能想到的唯一方法是基于收到的密钥。如果键 description 存在,它是一个产品,如果 username 存在,它是一个用户......
  • 最好尝试使用 typescript 并为您的 json 对象管理接口 (typescriptlang.org/docs/handbook/interfaces.html)[https://…
  • 你可以试试try {JSON.parse(yourResponse)}catch(e){} 。如果它解析,确定属性是否匹配。我认为这是恕我直言的解决方法。但它解决了你的问题,我猜

标签: javascript node.js express ecmascript-6


【解决方案1】:

如果您有某种控制悬停在 Json 中发送的数据(例如像 Mongo 文档),那么您可以在发送之前在对象上添加一个“类型”行,以便让您的节点服务器检索此数据并按照您的意愿处理。 另一种解决方案是使用不同的路由,例如 /api/user/api/products,然后您不需要更改发送的数据,但您可能会有很多重复。

否则你无法知道 json 中的对象类型。

【讨论】:

  • 你好@Minirock,问题是项目必须只有一个路由并且json对象永远不会有“类型”属性。我想我应该考虑一种通过属性发现对象类型的方法。
【解决方案2】:

“最好”的方法是遵循 12 因素提案 blah blah https://12factor.net/ 但为了实现您的目标,我们有几个选项可以使用它们查询参数

http://localhost:3000/api/v1/end-point?kind=user

http://localhost:3000/api/v1/end-point?kind=otherOption

import express from 'express';
import {json, urlencoded} from 'body-parser';
import helmet from 'helmet';
import compress from 'compression';
import cors from 'cors';

const app = express()

app.use(helmet());
app.use(compress());
app.use(json());
app.use(urlencoded({ extended: true }));
app.use(cors());

app.use('/api/v1/myAwesomeEndPoint', (req, res) => {
  const {kind} = req.query.params;

  if (kind === 'user') {
    // do them user logic
    return res.status(200).send({success: true, message: '<3'})
  }

  // apply the other option logic
  return res.status(200).send({success: true, message: '<3'})
})

但如果你真的想拥有相同的 uri,我们仍然可以这样做

import express from 'express';
import {json, urlencoded} from 'body-parser';
import helmet from 'helmet';
import compress from 'compression';
import cors from 'cors';

const app = express()

app.use(helmet());
app.use(compress());
app.use(json());
app.use(urlencoded({ extended: true }));
app.use(cors());

app.use('/api/v1/myAwesomeEndPoint', (req, res) => {
 const {body} = req;

  if (body.hasOwnProperty('user')) {
    // do them user logic
    return res.status(200).send({success: true, message: '<3'})
  }


  return res.status(200).send({success: true, message: '<3'})
})

【讨论】:

    猜你喜欢
    • 2021-07-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    相关资源
    最近更新 更多