快速路线行为不正确

时间:2016-09-15 17:31:11

标签: node.js express routes

在我的app.js和其他路线中,我的路线指定为......

app.route('/api/patients/:id/medication').get(MedicationController.all).post(MedicationController.add)

此路线的控制器以及所有其他控制器从外部模块拉入。但是,这条路线的GET方法非常奇怪,而POST的效果非常好。

当我对GET参数的网址中有效uuid的上述路由发出id请求时(例如/api/patients/bd4d6d44-3af3-4224-afef-d7e9a876025b/medication),没有错误,但我得到了回应......

{
    status:200,
    data: []
}

这对我没有任何意义,因为我更新了MedicationController.all函数以包含另一个用于测试的字段,因此即使查询没有结果,响应应该是......

{
    status: 200,
    data: [],
    test: 'TEST FIELD'
}

另一件事,对我来说没有意义的是,我可以在/api/patients/bd4d6d44-3af3-4224-afef-d7e9a876025b/medafsdghads之后输入uuid或其他一些垃圾子路径,但仍会返回相同的奇怪响应。

如果重要,这是实际的处理程序......

export function all(req, res) {
  let id = req.params.id

  r.table('Patients').get(id).getField('prescriptions').run().then((results) => {
    console.log(results)
    return res.json({ status: 200, data: results, testField: 'TEST FIELD' })
  }).catch((error) => {
    console.log(error)
    return res.json({ status: 400, message: 'There was an error finding the medication of patient ' + id, data: error })
  })
}

以下也是所有我目前正在实施的路线......

/*********************
* PATIENT API ROUTES *
*********************/
app.route('/api/patients').get(PatientController.all).post(PatientController.add)
app.route('/api/patients/:last/:first').get(PatientController.findName)
app.route('/api/patients/:id').get(PatientController.findId)

/************************
* MEDICATION API ROUTES *
************************/
app.route('/api/patients/:id/medication').get(MedicationController.all).post(MedicationController.add)
app.route('/api/patients/:id/medication/expiration').put(MedicationController.updateAllExpirations)
app.route('/api/patients/:patId/medication/expiration/:medId').put(MedicationController.updateExpiration)

/*************************
* INSTITUTION API ROUTES *
*************************/
app.route('/api/institutions').get(InstitutionController.all).post(InstitutionController.add)
app.route('/api/institutions/:id').get(InstitutionController.findId)
app.route('/api/institutions/:name').get(InstitutionController.findName)

1 个答案:

答案 0 :(得分:1)

您有相同网址匹配的路由重叠:

// This one:
app.route('/api/patients/:last/:first')

// And this one: 
app.route('/api/patients/:id/medication')

Express与最合乎逻辑的路由不匹配,它匹配与请求匹配的第一个声明的路由。在您的情况下,/api/patients/bd4d6d44-3af3-4224-afef-d7e9a876025b/medication与第一条路线匹配。

您应首先声明更多特定路线(匹配参数较少)。