【问题标题】:Strange occurrence in ExpressJS: Callback function isn't calledExpressJS 中的奇怪事件:未调用回调函数
【发布时间】:2014-07-21 16:07:29
【问题描述】:

我正在使用带有 node 的 expressjs 来创建我的网络应用程序,但它没有按预期工作。

这里发生了一些非常奇怪的事情,如果我转到浏览器中的第一个链接,它会按预期工作,但如果我转到第二个链接,它不会执行回调并返回 null。正如您可能看到的那样,它们是相同的!

第一个 API 代码片段(第一个链接):

/**
 * GET /workspace/friends/list
 * JSON friend list API
 */

app.get('/workspace/friends/list', passportConf.isAuthenticated, function (req, res) {
  var userFriends = [];
  //console.log(req);
  for (var i = 0; i < req.user.friends.length; i++) {
    if (req.user.friends[i].verified) {
      userFriends.push(req.user.friends[i]);
    }
  }
  res.json(userFriends);
});

第二个 API 代码片段(第二个链接):

/**
 * GET /workspace/friends/sentRequests/
 * JSON friends requests list API
 */

//TODO: Fix API
app.get('/workspace/friends/sentRequests', passportConf.isAuthenticated, function (req, res) {
  var userFriends = [];
  //console.log(req);
  for (var i = 0; i < req.user.friends.length; i++) {
    if (!req.user.friends[i].verified) {
      userFriends.push(req.user.friends[i]);
    }
  }
  res.json(userFriends);
});

注意:我还必须补充一点,如果我在两者中取消注释 console.logs,我会从第一个而不是第二个获得日志。

这怎么可能?有没有人遇到过类似的事情?我该如何解决?

【问题讨论】:

  • @meagar 是的,我的状态为 200。 :-/
  • 对我来说,您似乎在其他地方定义了类似的路由,该路由会触发并结束请求。
  • @Steffen 也不是问题,因为我在文件中搜索了 '/workspace/friends/sentRequests' 并且只得到了 2 个匹配项,一个在注释块中,一个在 get 请求中。 :-(

标签: javascript node.js rest express get


【解决方案1】:

嗯,我想通了。这显然是某种错误,它禁止在链接中使用长字符和/或大写字符,please see this issue I've created (issue #2256)

所以当我将其更改为以下内容时,它工作正常:

/**
 * GET /workspace/friends/sentRequests/
 * JSON friends requests list API
 */

//TODO: Fix API
app.get('/workspace/friends/requests/sent', passportConf.isAuthenticated, function (req, res) {
  var userFriends = [];
  console.log(req);
  for (var i = 0; i < req.user.friends.length; i++) {
    if (!req.user.friends[i].verified) {
      userFriends.push(req.user.friends[i]);
    }
  }
  res.json(userFriends);
});

注意:我还没有弄清楚错误的根源。

更新 (22/07/2014): 发生的事情是样板文件 Skeleton 已定义 Express 的 case sensitive routing 选项启用,所以当我使用和还使用模块express-uncapitalize,所以当我用大写字符定义链接并将完全相同的链接放在浏览器中时,它没有大写,快递找不到那个链接但没有大写(因为它区分大小写)。

【讨论】:

  • 一个愚蠢的问题,但你确定它在没有 passportConf.isAuthenticated 中间件的情况下工作吗?你确定这是函数处理 (req,res,next) 参数吗?我不知道这是否与您的问题有关,但是在使用 Passport.js 时,我犯了一个愚蠢的错误,使我疯狂了大约一周。我依赖于 Passport 提供的 req.isAuthenticated() 方法。但是当我写我的测试时,我忘记了括号,这导致我的应用程序只检查 req.isAuthenticated 是否被定义......但这可能与你的问题无关,如果是这样的话,对不起。
  • 感谢您的反馈@WaldoJeffers,但在其他 API GET 侦听器上一切正常...看来我正在使用的 Express 版本有一个选项可以阻止链接中的大写字符,那就是发生了什么,这是我正在使用的样板所使用的定义 (Skeleton),请参阅 this issue
猜你喜欢
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-27
  • 2020-08-09
相关资源
最近更新 更多