关于nodejs,express,mongoose的错误(该对象没有函数)

时间:2015-04-07 11:25:18

标签: node.js mongodb express mongoose

我在代码中遇到了一些错误!请帮帮我

我想在我的网站上创建一个注册函数,但是我遇到了一些问题:

由Express 4.X提供支持的代码

在模型中,我的代码是: 模型/ Account.js



var mongoose = require('mongoose');
var nodemailer = require('nodemailer');
var smtpTransport = require('nodemailer-smtp-transport');
var crypto = require('crypto');


module.exports = function(config, mongoose, nodemailer){

    var AccountSchema = new mongoose.Schema({

        email: {type: String, unique: true},
        password: {type: String},
        name: {
            first: {type: String},
            last: {type: String}
        },
        birthday: {
            day: {type: Number, min: 1, max: 31, require: false},
            month: {type: Number, min: 1, max: 12, require: false},
            year: {type: Number}
        },
        photourl: {type: String},
        blography: {type: String}
    });

    var Account = mongoose.model('Account', AccountSchema);

    var registerCallback = function(err){
        if(err){
            return console.log(err);
        };
        return console.log('Account was created!');
    };

    var changePassword = function(accountId, newpassword){
        var shaSum = crypto.createHash('sha256');
        shaSum.update(newpassword);
        var hashedPassword = shaSum.digest('hex');
        Account.update({_id: accountId}, {$set:{password: hashedPassword}}, {upsert: false},
                      function changePasswordCallback(err){
                      console.log('Change password for' + accountId);
                      }
                      );
    };

    var forgetPassword = function(email, resetPasswordUrl, callback){
        var user = Account.findOne({email: email}, function findOne(err, doc){
            if(err){
                callback(false);
            }else{
                var smtpTransport = nodemailer.createTransport('SMTP', config.mail);
                resetPasswordUrl += '?account' + doc._id;
                smtpTransport.sendMail({
                    from: 'admin@rccoder.net',
                    to: doc.email,
                    subject: 'Password Request',
                    text: 'Click to get password' + reserPasswordUrl
                }, function fogotPasswordUrl(err){
                    if(err){
                        callback(false);
                    }else{
                        callback(true);
                    }
                });
            }
        });
    };

    var login = function(emai, password, callback){
        var shaSum = crypto.createHasn('sha256');
        shaSm.update(password);
        Account.findOne({email: email, password: shaSum.digest('hex')}, function(err, doc){
            callback(null != doc);
        });
    };

    var register = function(email, password, firstName, lastName){
        var shaSum = crypto.createHash('sha256');
        shaSum.update(password);
        console.log('Register in ' + email);
        var user = new Account({
            email: email,
            name: {
                first: firstName,
                last: lastName
            },
            password: shaSum.digest('hex'),
        });
        user.save(registerCallback);
        console.log('Save command was send!');
    };

    return{
        register: register,
        forgotPassword: forgotPassword,
        changePassword: changePassword,
        login: login,
        Account: Account
    }
}




我的路由器是这样的:



var express = require('express');
var router = express.Router();
var crypto = require('crypto');
var Account = require('../models/Account.js')

/* GET home page. */
router.get('/', function(req, res, next) {
  res.render('index', { title: 'Express' });
});

router.get('/login', function(req, res, next){
	res.render('login', {title: 'Login'});
});
router.post('/login', function(req, res){
	console.log('login Request:');
	var email = req.param('Email', null);
	var password = req.param('Password', null);
	if(null = email || email.length < 1 || null = password || password.length < 1){
		res.send(400);
		return;
	}
	Account.login(email, password, function(success){
		if(!success){
			res.send(401);
			return;
		}else{
			console.log('Login is success!');
			res.send(200);
		}
	});
});

router.get('/reg', function(req, res, next){
	res.render('reg', {title: 'Register'});
});
router.post('/reg', function(req, res, next){
	console.log('Reg Request:');
	var email = req.body['Email'];
	var password = req.body['Password'];
	var FirstName = req.body['FirstName'];
	var LastName = req.body['LastName'];
	if(null == email || null == password){
		res.send(400);
		return;
	}else{
		Account.register(email, password, FirstName, LastName);
		res.send(200);
	}
});

module.exports = router;
&#13;
&#13;
&#13;

Ans这个名为reg.html的神庙是这样的:

&#13;
&#13;
{% extends 'layout.html' %}

{% block content %}
<p>Welcome to {{title}}</p>
<form method="POST">
	<label for="Email">Email:</label>
	<input type="text" name="Email">
	<label for="Password">Password:</label>
	<input type="password" name="Password">
	<label for="FirstName">FirstName</label>
	<input type="text" name="FirstName">
	<label for="LastName">LastName</label>
	<input type="text" name="LaseName">
	<input type="submit" value="Reg">
</form>
<ul>
	<li><a href="forgotPassword">ForgotPassword ?</a></li>
	<li><a href="register">Register</a></li>
</ul>
{% endblock %}
&#13;
&#13;
&#13;

但如果我在reg.html中检查了名为REG的提交,则会出现一些错误:

&#13;
&#13;
 Object function (config, mongoose, nodemailer){ var AccountsSchema = new ……………………)has no method 'register'
&#13;
&#13;
&#13;

,控制台就是:

&#13;
&#13;
Reg Request:
POST /reg 500 25.466 ms - 7685
&#13;
&#13;
&#13;

我的代码中没有发生过这种情况!

帮助

1 个答案:

答案 0 :(得分:0)

在您的模型中,export唯一的功能就是单一功能。 要使其工作,您应该使用参数(config, mongoose, nodemailer)调用该函数。这将返回一个对象,其中包含对要调用的函数的引用。您可能忽略了这一点,因为错误信息非常明确。

除此之外,我建议稍微改写一下。您可能想要完全删除此行:

module.exports = function(config, mongoose, nodemailer){

然后导出功能:

module.exports = {
    register: register,
    forgotPassword: forgotPassword,
    changePassword: changePassword,
    login: login,
    Account: Account
}

从那里开始