环回出现错误 - 同一版本本身 (3.0.0) 中用户验证密码功能的重大变化

Loopback getting error - Major change in User validatePassword function in the same release itself (3.0.0)

我正在使用 loopback 3.0.0,并且我最近设置了一台新服务器,大约一周前。为此,我有 运行 命令 npm install 通过放置 package.son 文件。

但是在那个安装的文件中,node_modules/loopback/common/user.js模块发生了重大变化。

例如:

旧文件:

// Copyright IBM Corp. 2014,2016. All Rights Reserved.
  User.validatePassword = function(plain) {
    var err;
    if (plain && typeof plain === 'string' && plain.length <= MAX_PASSWORD_LENGTH) {
      return true;
    }
    if (plain.length > MAX_PASSWORD_LENGTH) {
      err = new Error(g.f('Password too long: %s', plain));
      err.code = 'PASSWORD_TOO_LONG';
    } else {
      err =  new Error(g.f('Invalid password: %s', plain));
      err.code = 'INVALID_PASSWORD';
    }
    err.statusCode = 422;
    throw err;
  };

新文件:

// Copyright IBM Corp. 2014,2018. All Rights Reserved.
User.validatePassword = function(plain) {
        var err;
        if (!plain || typeof plain !== 'string') {
          err = new Error(g.f('Invalid password.'));
          err.code = 'INVALID_PASSWORD';
          err.statusCode = 422;
          throw err;
        }

        // Bcrypt only supports up to 72 bytes; the rest is silently dropped.
        var len = Buffer.byteLength(plain, 'utf8');
        if (len > MAX_PASSWORD_LENGTH) {
          err = new Error(g.f('The password entered was too long. Max length is %d (entered %d)',
            MAX_PASSWORD_LENGTH, len));
          err.code = 'PASSWORD_TOO_LONG';
          err.statusCode = 422;
          throw err;
        }
      };

我用相同的版本开发了我的代码,但使用的是他们在相同版本 (3.0.0.) 中提供的旧代码。在这里你可以看到,在新代码中没有 return 语句,因此代码无限等待 return 并超时。在这两个地方,package.json 文件包含相同的版本:"loopback": "^3.0.0"

我希望不要将 node_modules 从我们的开发服务器复制到生产服务器。

那么我们该如何处理这类问题呢?

在 package.json 中指定版本号时有几种不同的方法 https://docs.npmjs.com/files/package.json#dependencies:

你的方式是默认的,^这意味着

compatible with version

所以 ^3.0.0 将只安装 3.0.0 如果它是最新的次要版本和修复版本,否则它将采用当天最新版本的 loopback。今天是 3.19.3.

这个问题是在版本 v3.10.1 中引入的(感谢@vasan)所以本地可能你有版本 3.10.0 然后在服务器上你有 3.10.1

这个问题对版本号有很好的解释What's the difference between tilde(~) and caret(^) in package.json?

我建议使用一个准确的版本,即 3.19.3 然后使用像 rennovate 这样的服务,https://github.com/renovate-bot,更新您的项目以保持最新的安全补丁

这里还有一个防范措施,package-lock.json https://docs.npmjs.com/files/package-lock.json在npm 5版本中引入。如果你检查这个文件,它会确保你 运行 npm install 无论你在哪里 运行 安装 npm 模块的确切版本。