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

Error about nodejs, express, mongoose(The object has no function)

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

我想为我的站点创建一个注册功能,但是我遇到了一些问题:

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

在模型中,我的代码是: model/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;

答案叫reg.html的寺庙是这样的:

{% 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 %}

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

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

控制台是:

Reg Request:
POST /reg 500 25.466 ms - 7685

我不知道我的代码中发生了什么!

帮助

在您的模型中,您唯一 export 是一个单一的功能。 要完成这项工作,您应该使用参数 (config, mongoose, nodemailer) 调用该函数。这将 return 一个包含对您要调用的函数的引用的对象。您可能忽略了这一点,因为错误消息非常清楚。

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

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

并导出函数:

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

从那里开始