我正在使用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;
};
新文件:
// 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 语句,所以代码无限地等待返回和超时。在这两个地方,package.json文件包含相同的版本:"loopback": "^3.0.0"
我希望不建议将node_modules从开发服务器复制到生产服务器。
那么我们如何处理这类问题?
答案 0 :(得分:2)
在package.json中指定版本号时,有几种不同的方式https://docs.npmjs.com/files/package.json#dependencies:
您的方式是默认值,^
表示
与版本
兼容
所以^ 3.0.0只会安装3.0.0 如果它是最新的次要版本和修复版本,否则它将采取当天最新版本的环回。今天是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这样的服务来更新您的项目,以便及时了解安全补丁
在npm的第5版中引入了另一个针对此的警卫,package-lock.json https://docs.npmjs.com/files/package-lock.json。如果您在其中检查此文件,将确保无论您在何处运行npm install
,都会在您运行它的任何地方安装npm模块的确切版本。