Nodejs微博例子中"ReferenceError: crypto is not defined"
Nodejs微博例子中"ReferenceError: crypto is not defined"
app.js中已经添加了:var crypto = require(‘crypto’);
但是点击注册的时候显示错误如下:
POST /reg 500 42ms
DEBUG: crashing child
DEBUG: Starting child process with 'node app.js’
Express server listening on port 3000
ReferenceError: crypto is not defined
at exports.doReg (C:\Users\lin\blogA\routes\index.js:23:11)
at callbacks (C:\Users\lin\blogA\node_modules\express\lib\router\index.j
s:164:37)
at param (C:\Users\lin\blogA\node_modules\express\lib\router\index.js:13
8:11)
at pass (C:\Users\lin\blogA\node_modules\express\lib\router\index.js:145
:5)
at Router._dispatch (C:\Users\lin\blogA\node_modules\express\lib\router
index.js:173:5)
at Object.router (C:\Users\lin\blogA\node_modules\express\lib\router\ind
ex.js:33:10)
at next (C:\Users\lin\blogA\node_modules\express\node_modules\connect\li
b\proto.js:190:15)
at next (C:\Users\lin\blogA\node_modules\express\node_modules\connect\li
b\middleware\session.js:312:9)
at C:\Users\lin\blogA\node_modules\express\node_modules\connect\lib\midd
leware\session.js:336:9
at C:\Users\lin\blogA\node_modules\connect-mongo\lib\connect-mongo.js:19
4:17
POST /reg 500 39ms
index.js代码如下:
exports.doReg = function(req, res) { //检验用户两次输入的口令是否一致 if(req.body[‘password-repeat’] != req.body[‘password’]) { req.flash(‘error’, ‘两次输入的口令不一致’); return res.redirect(’/reg’); } //生成口令的散列值 var md5 = crypto.createHash(‘sha1’); var password = md5.update(req.body.password).digest(‘base64’); var newUser = new User({ name: req.body.username, password: password, }); //检查用户名是否已经存在 User.get(newUser.name, function(err, user) { if(user) err = ‘Username already exists.’; if(err) { req.flash(‘error’, err); return res.redirect(’/reg’); } //如果不存在则新增用户 newUser.save(function(err) { if(err) { req.flash(‘error’, err); return res.redirect(’/reg’); } req.session.user = newUser; req.flash(‘success’, ‘注册成功’); res.redirect(’/’); }); });
};
请问是什么原因,先谢谢了。
根据你描述的情况,问题可能出在index.js
文件中对crypto
模块的引用。尽管你在app.js
文件中正确地引入了crypto
模块,但如果你在index.js
文件中使用crypto
时没有重新引入它,就会出现ReferenceError: crypto is not defined
错误。
解决方案
确保在index.js
文件中也正确引入crypto
模块。以下是修改后的代码示例:
const crypto = require('crypto'); // 确保引入crypto模块
exports.doReg = function(req, res) {
// 检验用户两次输入的口令是否一致
if (req.body['password-repeat'] != req.body['password']) {
req.flash('error', '两次输入的口令不一致');
return res.redirect('/reg');
}
// 生成口令的散列值
const md5 = crypto.createHash('md5'); // 使用MD5算法而不是SHA1
const password = md5.update(req.body.password).digest('hex'); // 返回十六进制格式
var newUser = new User({
name: req.body.username,
password: password,
});
// 检查用户名是否已经存在
User.get(newUser.name, function(err, user) {
if (user) {
err = 'Username already exists.';
}
if (err) {
req.flash('error', err);
return res.redirect('/reg');
}
// 如果不存在则新增用户
newUser.save(function(err) {
if (err) {
req.flash('error', err);
return res.redirect('/reg');
}
req.session.user = newUser;
req.flash('success', '注册成功');
res.redirect('/');
});
});
};
关于MD5与SHA1选择
- MD5 和 SHA1 都是非加密哈希函数,它们容易受到碰撞攻击。建议使用更安全的哈希算法如 bcrypt 或 scrypt。
示例改进
使用 bcrypt
来替换 crypto
模块以提高安全性:
-
安装
bcrypt
:npm install bcrypt
-
修改
index.js
文件:const bcrypt = require('bcrypt'); exports.doReg = function(req, res) { if (req.body['password-repeat'] != req.body['password']) { req.flash('error', '两次输入的口令不一致'); return res.redirect('/reg'); } // 使用bcrypt进行密码加密 bcrypt.hash(req.body.password, 10, function(err, hash) { if (err) { req.flash('error', '密码加密失败'); return res.redirect('/reg'); } var newUser = new User({ name: req.body.username, password: hash, }); User.get(newUser.name, function(err, user) { if (user) { err = 'Username already exists.'; } if (err) { req.flash('error', err); return res.redirect('/reg'); } newUser.save(function(err) { if (err) { req.flash('error', err); return res.redirect('/reg'); } req.session.user = newUser; req.flash('success', '注册成功'); res.redirect('/'); }); }); }); };
通过以上步骤,你应该能够解决ReferenceError: crypto is not defined
错误,并提高应用的安全性。
检查是不是 crypto 拼写错误
不是写在app.js里的 是在index里边的吧
ReferenceError: crypto is not defined at exports.doReg (C:\Users\lin\blogA\routes\index.js:23:11)
这不是说明了在index.js 里没有找到crypto
我碰到的错误是ReferenceError: app is not defined,请问有什么解决方法
同问
从你提供的信息来看,问题出在 index.js
文件中的 crypto
变量没有被正确引用。尽管你在 app.js
中引入了 crypto
模块,但在 index.js
文件中使用时需要重新引入。
解决方案
确保在 index.js
文件中也引入 crypto
模块:
var crypto = require('crypto'); // 注意引号是英文引号
示例代码
修改后的 index.js
文件应该包含以下内容:
var crypto = require('crypto');
exports.doReg = function(req, res) {
// 检验用户两次输入的口令是否一致
if(req.body['password-repeat'] != req.body['password']) {
req.flash('error', '两次输入的口令不一致');
return res.redirect('/reg');
}
// 生成口令的散列值
var md5 = crypto.createHash('md5'); // 使用 md5 而不是 sha1
var password = md5.update(req.body.password).digest('hex'); // 使用 hex 而不是 base64
var newUser = new User({
name: req.body.username,
password: password,
});
// 检查用户名是否已经存在
User.get(newUser.name, function(err, user) {
if(user) {
err = 'Username already exists.';
}
if(err) {
req.flash('error', err);
return res.redirect('/reg');
}
// 如果不存在则新增用户
newUser.save(function(err) {
if(err) {
req.flash('error', err);
return res.redirect('/reg');
}
req.session.user = newUser;
req.flash('success', '注册成功');
res.redirect('/');
});
});
};
解释
- 引入模块:在
index.js
文件的顶部引入crypto
模块。 - 使用
md5
而不是sha1
:通常情况下,MD5 是更常见的选择。 - 使用
hex
而不是base64
:虽然base64
也是有效的,但hex
更常用且更易读。
确保所有路径和依赖项都正确无误,并且 User
模型和其他中间件也已正确配置。