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(’/’); }); });

};

请问是什么原因,先谢谢了。


7 回复

根据你描述的情况,问题可能出在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选择

  • MD5SHA1 都是非加密哈希函数,它们容易受到碰撞攻击。建议使用更安全的哈希算法如 bcryptscrypt

示例改进

使用 bcrypt 来替换 crypto 模块以提高安全性:

  1. 安装 bcrypt:

    npm install bcrypt
    
  2. 修改 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('/');
        });
    });
};

解释

  1. 引入模块:在 index.js 文件的顶部引入 crypto 模块。
  2. 使用 md5 而不是 sha1:通常情况下,MD5 是更常见的选择。
  3. 使用 hex 而不是 base64:虽然 base64 也是有效的,但 hex 更常用且更易读。

确保所有路径和依赖项都正确无误,并且 User 模型和其他中间件也已正确配置。

回到顶部