关于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
}
从那里开始
我在代码中遇到了一些错误!请帮助我
我想为我的站点创建一个注册功能,但是我遇到了一些问题:
由 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
}
从那里开始