【问题标题】:Node | Wiring GET to successfully Posted Data节点 |将 GET 连接到成功发布的数据
【发布时间】:2019-03-03 20:31:58
【问题描述】:

尝试学习Node。

我有一个发送天气指标的发布请求,例如时间戳、温度、露点和降水。

我可以使用以下req.body 成功发布请求

我有一个处理业务逻辑的商店,即:

/* measurement-store */

export function addMeasurement(measurement) {
  // cache results on a new object
  const measurements = { timestamp: measurement.timestamp.toISOString() }

  if (measurement) {
    for (const [metric, value] of measurement.metrics.entries()) {
      measurements[metric] = value // retrieve metric values
    }
    return measurements
  } else {
    throw new HttpError(501)
  }
}

这就是端点使用它的方式

/*measure-routes.js*/

import * as store from './measurement-store'
****

// Handle POST Measurements
router.post('/', (req, res) => {
  const measurement = parseMeasurement(req.body) // method to parse the req.body

  store.addMeasurement(measurement)

  res
    .location(`/measurements/${measurement.timestamp.toISOString()}`)
    .status(201)
    .json({
      message: 'Measurements were successfully created',
      measurement
    })
})

您将在这里看到 POST 调用成功:

我的问题是无法获取和获取新创建的对象

我无法在我的商店中连接正确的业务逻辑,因此当我通过 GET 调用时,即http://localhost:9000/measurements/2015-09-02T16:00:00.000Z

使用status 200处理结果

这是我的 GET 路线

/*measure-routes.js*/

router.get('/:timestamp', (req, res) => {
  const result = store.fetchMeasurement(new Date(req.params.timestamp))
  if (result) res.json(serializeMeasurement(result))
  else res.sendStatus(404)
})

这就是serializeMeasurement() 处理数据的方式。

function serializeMeasurement(measurement) {
  const out = { timestamp: measurement.timestamp.toISOString() }

  for (const [metric, value] of measurement.metrics.entries()) {
    out[metric] = value
  }

  return out
}

你能帮我在这里应用正确的 GET 业务逻辑吗????????

/* measurement-store */

export function fetchMeasurement(timestamp) {
  if (timestamp) {
    console.log('FETCH', timestamp) // => 2015-09-02T16:00:00.000Z
  }
  throw new HttpError(501)
}


【问题讨论】:

  • 你为什么要扔fetchMeasurement()。调用它的代码没有捕获该异常。所以,/:timestamp 路由永远不会起作用。
  • 还定义了一个/:timestamp 路由,匹配您服务器上的所有顶级 GET 请求,因此您不能拥有任何其他请求。这也不是一个很好的设计理念。
  • 这里是 Node 的新手...你能给我看一个解决方案的例子吗?

标签: javascript node.js rest api express


【解决方案1】:

你为什么要输入fetchMeasurement()?调用它的代码没有捕获该异常。此外,fetchMeasurement() 没有返回任何内容,但调用它的代码需要返回值。

所以,/:timestamp 路由将永远无法工作。它会抛出并且永远不会发送响应。

我不确定我是否理解您所询问的整个问题,但您可以开始修复fetchMeasurement(),如下所示:

/* measurement-store */

export function fetchMeasurement(timestamp) {
  if (timestamp) {
    console.log('FETCH', timestamp) // => 2015-09-02T16:00:00.000Z
    // return something useful here
    return someValue;
  } else {
    return null;    // caller will send response error if returned value is null
  }
}

您必须填写fetchMeasurement()返回有用值的部分,因为调用代码:

const result = store.fetchMeasurement(new Date(req.params.timestamp))

期望一个有用的返回值。

【讨论】:

  • 谢谢 jfriend00。我可以摆脱Throw。只是不想编辑问题并失去我们 cmets 的含义。好的,所以我的问题是无法知道 someValue 的业务逻辑是什么以及在这种情况下应该是什么样子才能成功地根据路由进行 GET 调用。另外,那你建议我如何布线?
  • @NullisTrue - 我无法为您提供fetchMeasurement() 的正确业务逻辑。只有你能知道那是什么。您调用函数的方式是向它传递一个时间戳,它应该返回一个值,然后您将其传递给serializeMeasurement(),您没有显示其代码,因此我们不知道它期望什么。
  • @NullisTrue - 您不编辑问题中的代码并更改您最初询问的含义是正确的。您还想寻求什么帮助?
  • 好的 1- 如果我的 POST 成功。按照您的思路,我如何获取将 GET 请求作为http://localhost:9000/measurements/2015-09-02T16:00:00.000Z 传递的数据,someValue 的业务逻辑应该是什么来代替当前代码? 2-您还建议我如何修改get route
  • 抱歉没有看到您的第一条评论...我已将serializeMeasurement() 添加到帖子中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-04
  • 2019-01-14
  • 2014-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多