错误的Express路由器处理了API请求

时间:2018-10-11 13:26:25

标签: node.js express express-router

我们正在使用Express框架创建NodeJS应用程序。在使用路由器参数时,我们遇到了意外的行为。由于我们尚未准备好前端,因此正在邮递员中测试API。定义了以下两个API

private string podpisz(X509Certificate2 cert, string toSign)
{
    string output = "";

    try
    {
        RSACryptoServiceProvider csp = null;
        csp = (RSACryptoServiceProvider)cert.PrivateKey;

        // Hash the data
        SHA256Managed sha256 = new SHA256Managed();
        UnicodeEncoding encoding = new UnicodeEncoding();
        byte[] data = Encoding.Default.GetBytes(toSign);
        byte[] hash = sha256.ComputeHash(data);

        // Sign the hash
        byte[] wynBin = csp.SignHash(hash, CryptoConfig.MapNameToOID("SHA256"));
        output = Convert.ToBase64String(wynBin);

    }
    catch (Exception)
    {

    }

    return output;
}

我们从邮递员发出了一个请求“ http://localhost:3000/api/tif/test1/1”,收到的响应是“测试2”,其中应该已经响应了“测试1”。通过更改路由器的顺序,我可以得到预期的响应“测试一个”。我们无法推断出这种行为。

1 个答案:

答案 0 :(得分:1)

按照在路由器上注册的顺序和在应用程序中注册路由器的顺序检查路由是否与传入URL匹配。在您的情况下,第一个路由会找到与该路由的匹配项并处理请求,并且路由不会继续到任何其他路由处理程序。

首先,我假设此路由器已分配给/ api,因此它可以查看以/ api开头的所有路由。您没有显示该代码,但它似乎是您必须要做的。

因此,由于'/tif/:test2/:one''/tif/test1/:one'更通用,并且第一个将与您的URL /api/tif/test1/1相匹配,因此第二个路由将永远没有机会。

  

通过更改路由器的顺序,我可以得到预期的响应“测试一个”。我们无法推断出这种行为。

'/tif/test1/:one'放在第一位时,它在/api/tif/test1/1处获得第一个机会并与之匹配,因此您将获得所需的行为。

一个通用规则是:“如果您有多个可以匹配给定URL的路由,则将较不通用的路由放在较通用的路由之前,以便它们有机会匹配一个适合它们的URL。”如果您不这样做,那么通用性较低的路由将永远不会有匹配的机会,因为通用性较高的路由将首先匹配并先处理请求,然后其他人才有机会看到它们。