javascript - Node.JS 在询问实际存在的端点时返回 404

标签 javascript angularjs node.js

我有一个网络应用程序,由以前的公司创建,用 Angular.JS 编写。
应用程序向后端公开请求(用 Node.JS+Express 编写)以收集填充表格所需的一些数据。
具体来说,这是每次用户进入包含表的页面时应用程序发送的请求(配置变量包含访问 token )。

return $http.get(API + '/api/myPath/for/Having/Data', config).then(handleSuccess, handleError);

handleSuccess 和 handleError 是这样定义的

        handleSuccess: function (res) {
            debugger;
            var deferred = $q.defer();
            res.data.success ? deferred.resolve(res.data) : deferred.reject(res.data.message);
            return deferred.promise;
        },

        handleError: function (error) {
            return {
                success: false,
                message: error
            };
        }

在我的后端,我放了一个监听器来监听任何以“/api”为前缀的调用,就像这样

app.use('/api', authorization.validateToken);

还有另一个监听器,只有在没有匹配项时才应该工作(写在处理应用程序所有一般查询的文件的最后)

app.all('*', (req, res) => {
    console.log('Hi, Stack Overflow!');
    res.send({
        success: false,
        status: 404,
        message: 'Invalid Uri Resource'
    });
});

最后,这是应该在后端从 Angular.js 调用的端点

app.get('/api/myPath/for/Having/Data', something.somethingToCall);

这是有趣的部分:出于我仍然需要理解的原因,Angular.JS 两次调用该端点,导致一个过程失败 (404),另一个过程顺利进行 (200)。
操作流程应该是这样的:Angular 调用后端 --> Node 检查 token 的有效性 --> 如果一切正常则执行操作。
该操作被调用了两次(感谢 Visual Studio Code 调试器和 Chrome 的网络监视器),即使 token 的验证过程每次都正确执行,第一次 next() 函数将持有 app.all() 监听器。
此外,甚至在我开始调试发出的第一个请求之前,Google Chrome 上的 JavaScript 控制台就警告我出现了诸如“无法读取未定义的属性‘数据’”之类的错误,这意味着该请求被执行了两次第一次返回 404。

exports.validateToken = (req, res, next) => {
    console.log(`check user here`);
    // next();
    var token =  //I take the token 
    console.log(token);
    if (token) {
        jwt.verify(token, require('../../secret'), (err, decoded) => {
            if (err) {
                res.send({
                    success: false,
                    status: 500,
                    tokenExpired: true,
                    message: "Effettua nuovamente l'accesso"
                });
            } else {
                req.decoded = decoded;
                next();
            }
        });
    } else {
        res.send({
            success: false,
            status: 406, // Fprbidden
            message: 'User not Authenticated'
        });
    }
};

有人知道如何以某种方式帮助我吗? 编辑:这是 Chrome 如何看待这两个请求的示例。屏幕截图特别指的是第一个被调用并产生 404 的屏幕截图

CORS在后端是这样处理的

app.use(function (req, res, next) {

    if (req.headers.origin && (req.headers.origin.match("http:\/\/somewebsite.com.*") || req.headers.origin.match("http:\/\/localhost:8010") )) {
        res.header("Access-Control-Allow-Origin", req.headers.origin);
    }

    next();
});

此外,我正在添加需要调用的端点。这也利用 MongoDB + Mongoose 来查询数据库并将内容返回到前端。我传递的参数是 pageSize(每页有多少元素)和当前页码

exports.getAds = (req, res) => {

  var criteria = req.body || {};
  var pageSize = criteria['pageSize'] ? Number(criteria['pageSize']) : undefined;
  var pageNumber = criteria['pageNumber'] ? Number(criteria['pageNumber']) : undefined;

  var sort = criteria.sort || { createdAt: 'desc' };

  if (criteria.customerName) criteria.customerName = { $regex: `.*${criteria.customerName}.*`, $options: 'i' };
  if (criteria.spentEuros) criteria.spentEuros.$gte = criteria.spentEuros;
  if (criteria.referralMail) criteria.referralMail = { $regex: `.*${criteria.referralMail}.*`, $options: 'i' };


  console.log(criteria);

  var columns = "customerName duration spentEuros";

  if (pageSize && pageNumber) {
    Adv.paginate(criteria, {
      page: pageNumber,
      limit: pageSize,
      select: columns,
      sort: sort
    }, function (err, result) {
      if (!err) res.status(200).send({ success: true, data: result });
      else res.status(500).send({ success: false, message: err });
    });
  } else {
    Adv.find(criteria)
      .select(columns)
      .sort(sort)
      .exec(function (err, result) {
        if (!err) res.status(200).send({ success: true, data: result });
        else res.status(500).send({ success: false, message: err });
      });
  }

};

EDIT2:问题的解决方案:在后端添加一个 app.options 监听器(正如@slebetman 所指出的),以及已经存在的 app.get 一个,解决了这个问题

The first endpoint call that produces the 404

最佳答案

Here's the funny part: for a reason that I still have to understand, Angular.JS calls that endpoint twice...

这听起来很像浏览器发送 CORS预检 OPTIONS 请求,后跟 GET。检查正在使用的 HTTP 动词,如果您需要在端点上支持 CORS,请确保您正在处理 OPTIONS(而不仅仅是 GET)。 (如果您不认为这是一个跨域请求,请检查页面的来源相对于 API 调用的来源,[协议(protocol)、端口、域] 似乎有所不同——如果 这是一个 OPTIONS 调用。)

关于javascript - Node.JS 在询问实际存在的端点时返回 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53968718/

相关文章:

node.js - REST API 聊天 - 实时获取消息的端点

javascript - 在 PC 浏览器上模拟触摸事件

javascript - 将自动完成 HTML 建议插入搜索栏中

javascript - 输入类型日期的angularjs日期格式验证

javascript - 在 angularjs 中使用 ng-show/hide 平滑过渡

angularjs - Jasmine 测试中的引用错误 : Can't find variable

javascript - 在循环中调用异步递归函数并在angularjs中获取结果

node.js - 在 package.json 文件中指定 nodejs 版本以确保不使用已弃用的 API

logging - Socket.io 启动输出杀死 node.js 守护进程的 Upstart 脚本

javascript - 与 JS 中的 Number.toExponential 相反