1

我有一个 Express (v3) 应用程序,其中(在理想情况下)用户在输入字段中键入字符串,等待自动完成函数返回与字符串匹配的列表,然后从该列表中进行选择,从而添加一个“id”隐藏字段的值。当他们单击“开始”时,他们的请求将通过他们的查询路由到此端点:

app.get('/predict', function(req, res) {

  // req.query should be something like
  // { name: "wat", id: 123 }

  res.render('predictions');
}

我想稍微改变一下这个功能,这样如果 req.query.id 为空(即用户没有等待自动完成),我不必将它们重定向回来说“请等待自动完成”。

在我看来,我想扩展上述端点来做类似的事情

app.get('/predict', function(req, res) {

  // req.query is { name: 'wat', id: '' }

  if(req.query.id=='') {
    // then the user didn't wait for the autocomplete, so
    // guess the id ourselves
  } else {
    // ... some code
    res.render('predictions');
  }
}

在为自己猜测 ID 时,我使用的外部 API 与用于自动完成功能的 API 相同,该 API 根据查询参数返回具有置信度值的结果数组,即它认为结果是我想要的结果的可能性有多大。

现在我们来回答这个问题。我可以做这样的事情吗?

app.get('/predict', function(req, res) {

  // req.query is { name: 'wat', id: '' }

  if (req.query.id=='') {

    makeRequestToAPIWithQuery(req.query.name, function(err, suggestions) {

      // suggestions[0] should contain my 'best match'
      var bestMatchName = suggestions[0].name;
      var bestMatchId   = suggestions[0].id;

      // I want to redirect back to *this* endpoint, but with different query parameters
      res.redirect('/predict?name='+bestMatchName+'&id='+bestMatchId);
    }
  } else {
    // some code
    res.render('predictions');
  }
}

如果 req.query.id 为空,我希望服务器向自身发出不同的请求。所以在重定向之后,req.query.id 不应该为空,并且 res 将根据需要呈现我的“预测”视图。

这可能/明智/安全吗?我错过了什么吗?

提前非常感谢。

4

1 回答 1

3

express 路由器接受多个处理程序作为中间件。

您可以测试id第一个处理程序中是否存在并相应地填充您的请求对象,然后在原始处理程序中没有发生任何事情。

function validatePredictForm(req, res, next) {
  if(!req.query.id) {
    req.query.id = 'there goes what your want the default value to be';
    return next();
  }
  else {
    // everything looks good
    return next();
  }
}

app.get('/predict', validatePredictForm, function(req, res) {

  // req.query should be something like
  // { name: "wat", id: 123 }

  res.render('predictions');
});
于 2013-03-05T17:23:22.407 回答