【发布时间】: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