TypeError:“digest”参数是必需的,不能未定义

Posted

技术标签:

【中文标题】TypeError:“digest”参数是必需的,不能未定义【英文标题】:TypeError: The "digest" argument is required and must not be undefined 【发布时间】:2017-11-20 05:21:23 【问题描述】:

我在通过http://localhost:3000/auth/register 注册一个简单的平均应用程序时遇到主题错误,我只是使用mean init 命令创建的。 pbkdf2crypto 正在生成错误,我不知道在哪里寻找它。

我做了很多不同的事情,比如清除 npm 缓存,使用 npm 重新安装等。请帮帮我。以下是更多信息。

Mean --version: 0.12.15
npm --version: 5.0.3
node --version: v8.1.0
bower --version: 1.8.0
gulp --version: CLI and Local: 3.9.1

model.UserSchema.methods.hashPassword 的代码(D:\Projects\Mean\CampaignBuilder\node_modules\meanio-users\server\models\user.js)

/**
 * Hash password
 *
 * @param String password
 * @return String
 * @api public
 */
UserSchema.methods.hashPassword = function(password) 
  if (!password || !this.salt) return '';
  var salt = new Buffer(this.salt, 'base64');
  return crypto.pbkdf2Sync(password, salt, 10000, 64).toString('base64');
;

注册页面调用http://localhost:3000/api/register并生成500 Internal Server Error

Firefox 显示以下响应:

TypeError: The "digest" argument is required and must not be undefined
at pbkdf2 (crypto.js:635:11)
at Object.exports.pbkdf2Sync (crypto.js:628:10)
at model.UserSchema.methods.hashPassword (D:\Projects\Mean\CampaignBuilder\node_modules\meanio-users\server\models\user.js:165:17)
at model.<anonymous> (D:\Projects\Mean\CampaignBuilder\node_modules\meanio-users\server\models\user.js:94:31)
at VirtualType.applySetters (D:\Projects\Mean\CampaignBuilder\node_modules\mongoose\lib\virtualtype.js:94:25)
at model.Document.set (D:\Projects\Mean\CampaignBuilder\node_modules\mongoose\lib\document.js:656:12)
at model._handleIndex (D:\Projects\Mean\CampaignBuilder\node_modules\mongoose\lib\document.js:587:14)
at model.Document.set (D:\Projects\Mean\CampaignBuilder\node_modules\mongoose\lib\document.js:547:24)
at model.Document (D:\Projects\Mean\CampaignBuilder\node_modules\mongoose\lib\document.js:71:12)
at model.Model (D:\Projects\Mean\CampaignBuilder\node_modules\mongoose\lib\model.js:46:12)
at new model (D:\Projects\Mean\CampaignBuilder\node_modules\mongoose\lib\model.js:3621:13)
at create (D:\Projects\Mean\CampaignBuilder\node_modules\meanio-users\server\controllers\users.js:86:24)
at Layer.handle [as handle_request] (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\layer.js:95:5)
at next (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\layer.js:95:5)
at D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\index.js:281:22
at Function.process_params (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\index.js:335:12)
at next (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\index.js:275:10)
at loadUser (D:\Projects\Mean\CampaignBuilder\node_modules\meanio-users\server\controllers\users.js:202:24)
at Layer.handle [as handle_request] (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\index.js:317:13)
at D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\index.js:284:7
at Function.process_params (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\index.js:335:12)
at next (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\index.js:275:10)
at D:\Projects\Mean\CampaignBuilder\node_modules\connect-modrewrite\index.js:129:7
at Layer.handle [as handle_request] (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\layer.js:95:5)
at trim_prefix (D:\Projects\Mean\CampaignBuilder\node_modules\meanio\lib\core_modules\server\node_modules\express\lib\router\index.js:317:13)

【问题讨论】:

请贴出model.UserSchema.methods.hashPassword的代码(D:\Projects\Mean\CampaignBuilder\node_modules\meanio-users\server\models\user.js:165:17)跨度> 正如我所说,我使用 mean init 创建了应用程序,因此它是默认的 MEAN 应用程序。但是,为便于参考,为 model.UserSchema.methods.hashPassword 添加了代码。 【参考方案1】:

根据crypto.pbkdf2Sync 方法,您缺少最后一个参数digest,因此会显示错误。

crypto.pbkdf2

此外,通过进一步调查,您可以看到在 Node v6.0 中需要摘要参数。

以前的默认值似乎是'sha1'

【讨论】:

您能指导一下我应该使用什么吗?我的意思是我应该使用“sha512”或“md5”还是我想要的任何东西?或者在选择任何东西之前,我是否需要检查 MEAN 应用程序的其他位置或配置?还是仅仅硬编码“sha512”就足够了? 非常感谢。这适用于“sha512”(登录/注册两者)。所以我认为解密也可以工作。我是 MEAN、NodeJS 和所有这些东西的新手,这让我抓狂,因为我什么都不知道。 很高兴我能提供帮助,文档/阅读堆栈跟踪始终是尝试调试的一个很好的开始。你很快就会掌握它的窍门。是的,如果你能登录,那你就没事了。 对于像我这样的新手,我做了以下工作以使其按照此答案中的建议工作。 return crypto.pbkdf2Sync(password, salt, 10000, 64, 'sha512').toString('base64');【参考方案2】:

这也可能是由于节点版本错误/运行的版本具有您活动的节点版本不支持的调用

我的经验:我的团队有一个需要 Node 6.10.0 的应用程序。有时我忘记切换到这个版本的节点并在 8.6.0 下运行最新的代码,我收到同样的错误。一旦我切换回 6.10.0,网站就会允许我登录。

(我可以看到接受的答案也提到了这一点,但我想添加一个更明显的答案,以防它帮助那里的人!)

【讨论】:

以上是关于TypeError:“digest”参数是必需的,不能未定义的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:AuthMiddlewareStack() 缺少 1 个必需的位置参数:'inner'

TypeError:scatter()缺少1个必需的位置参数:'y'

TypeError: fit() 缺少 1 个必需的位置参数:'y',

StandardScaler:TypeError:fit()缺少1个必需的位置参数:'X'

Pandas:TypeError:sort_values() 缺少 1 个必需的位置参数:'by'

TypeError:entry() 缺少 1 个必需的位置参数:'title'(Django 帮助)