Node.js 环回获取错误-同一版本(3.0.0)中用户validatePassword函数的重大更改

Node.js 环回获取错误-同一版本(3.0.0)中用户validatePassword函数的重大更改,node.js,loopbackjs,Node.js,Loopbackjs,我正在使用loopback 3.0.0,最近,大约一周前,我安装了一台新服务器。为此,我通过放置package.son文件来运行命令npm install 但是在这些已安装的文件中,node_modules/loopback/common/user.js模块发生了重大更改 Egs: 旧文件: // Copyright IBM Corp. 2014,2016. All Rights Reserved. User.validatePassword = function(plain) {

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

但是在这些已安装的文件中,node_modules/loopback/common/user.js模块发生了重大更改

Egs:

旧文件:

// 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;
  };
我用相同的版本开发了我的代码,但使用了他们在相同版本(3.0.0.)中提供的旧代码。在这里您可以看到,在新代码中没有return语句,因此代码无限期地等待返回并超时。在这两个位置,package.json文件都包含相同的版本:
“环回”:“^3.0.0”

我希望不建议将node_模块从开发服务器复制到生产服务器


那么我们如何处理这些类型的问题呢?

在package.json中指定版本号时,有几种不同的方法:

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

与版本兼容

因此,^3.0.0将只安装3.0.0,如果它是最新的次要版本和修复版本,否则它将采用当天最新版本的环回。今天是
3.19.3

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

关于这个问题中的版本号有一个很好的解释

我建议使用准确的版本,即
3.19.3
,然后使用rennovate之类的服务来更新您的项目,以跟上安全补丁的更新


还有另一种防范措施,即npm版本5中引入的package-lock.json。如果您签入此文件,它将确保无论您在哪里运行
npm install
npm模块,无论您在哪里运行它,都会安装npm模块的确切版本

在package.json中指定版本号时,有几种不同的方法:

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

与版本兼容

因此,^3.0.0将只安装3.0.0,如果它是最新的次要版本和修复版本,否则它将采用当天最新版本的环回。今天是
3.19.3

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

关于这个问题中的版本号有一个很好的解释

我建议使用准确的版本,即
3.19.3
,然后使用rennovate之类的服务来更新您的项目,以跟上安全补丁的更新


还有另一种防范措施,即npm版本5中引入的package-lock.json。如果您签入此文件,它将确保无论您在哪里运行
npm install
npm模块,无论您在哪里运行它,都会安装npm模块的确切版本

回答得好。附录:OP所指的变更是在年引入的。所以,只是有旧代码的盒子从3.10.0开始就没有运行过更新。谢谢@Peter GraingerGood answer。附录:OP所指的变更是在年引入的。所以,只是有旧代码的盒子从3.10.0开始就没有运行过更新。谢谢@Peter Grainger
// 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;
        }
      };