#javascript #node.js #mongoose
#javascript #node.js #mongoose
Вопрос:
У меня есть Mean.js проект, очень простой, поскольку я только осваиваюсь в этом пространстве. Я создал параллельный проект в отдельной папке для нескольких тестов, и я не использую mean.js фреймворк для этого, поскольку это просто материал командной строки, который я использую для некоторых экспериментов.
Когда я пытаюсь включить один из файлов модели mongoose из mean.js проект, в котором я столкнулся с проблемами. используя абсолютные или относительные пути, я могу загрузить файл (показано некоторыми инструкциями отладки в файле, который я добавляю), но я не могу использовать схему, которая должна быть зарегистрирована после ее включения. Если я скопирую файл в локальную папку проекта и потребую эту копию, все работает нормально.
Итак, я пытаюсь понять, существует ли какое-либо ограничение на то, как require включает данные из других папок.
Примеры:
require('user.server.model.js'); //works
require('./user.server.model.js'); //works
require('./../../site/app/models/user.server.model.js'); //fails
require('../../site/app/models/user.server.model.js'); //fails
require('/home/mean/site/app/models/user.server.model.js'); //fails
Запрос выполняется успешно, но когда я позже пытаюсь использовать модель, зарегистрированную в этом файле, я получаю ошибки при сбое.
var User = mongoose.model('User'); //fails on the ones that requied the original location
//Error: MongooseError: Schema hasn't been registered for model "User".
Я пробовал другие инструменты, такие как rekuire, но безуспешно. Кроме того, я пытался использовать символическую ссылку и испытывал те же сбои. Файлы идентичны в соответствии с diff и тем фактом, что я напрямую скопировал файл. Этот проект не загружает ни один из компонентов express, и это нормально. Я пытался следовать потоку программы на стороне express, и я не вижу причин, по которым это должно произойти (особенно когда это работает с локальной копией).
Я хочу перенести свои модели данных для mongoose из моего основного приложения, но не переносить эту кодовую базу в это приложение, кто-нибудь видит способ сделать это?
Редактировать
Сокращенная версия моего кода, которая терпит неудачу:
var mongoose = require('mongoose');
require(path.resolve('./user.server.model.js'));
var User = mongoose.model('User'); //errors here if I use a require like the failing ones above
И код в файле шаблонной модели:
'use strict';
/**
* Module dependencies.
*/
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
crypto = require('crypto');
/**
* A Validation function for local strategy properties
*/
var validateLocalStrategyProperty = function(property) {
return ((this.provider !== 'local' amp;amp; !this.updated) || property.length);
};
/**
* A Validation function for local strategy password
*/
var validateLocalStrategyPassword = function(password) {
return (this.provider !== 'local' || (password amp;amp; password.length > 6));
};
/**
* User Schema
*/
var UserSchema = new Schema({
firstName: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your first name']
},
lastName: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your last name']
},
displayName: {
type: String,
trim: true
},
email: {
type: String,
trim: true,
default: '',
validate: [validateLocalStrategyProperty, 'Please fill in your email'],
match: [/. @. .. /, 'Please fill a valid email address']
},
username: {
type: String,
unique: true,
required: 'Please fill in a username',
trim: true
},
password: {
type: String,
default: '',
validate: [validateLocalStrategyPassword, 'Password should be longer']
},
salt: {
type: String
},
provider: {
type: String,
required: 'Provider is required'
},
providerData: {},
additionalProvidersData: {},
roles: {
type: [{
type: String,
enum: ['user', 'admin']
}],
default: ['user']
},
updated: {
type: Date
},
created: {
type: Date,
default: Date.now
}
});
/**
* Hook a pre save method to hash the password
*/
UserSchema.pre('save', function(next) {
if (this.password amp;amp; this.password.length > 6) {
this.salt = new Buffer(crypto.randomBytes(16).toString('base64'), 'base64');
this.password = this.hashPassword(this.password);
}
next();
});
/**
* Create instance method for hashing a password
*/
UserSchema.methods.hashPassword = function(password) {
if (this.salt amp;amp; password) {
return crypto.pbkdf2Sync(password, this.salt, 10000, 64).toString('base64');
} else {
return password;
}
};
/**
* Create instance method for authenticating user
*/
UserSchema.methods.authenticate = function(password) {
return this.password === this.hashPassword(password);
};
/**
* Find possible not used username
*/
UserSchema.statics.findUniqueUsername = function(username, suffix, callback) {
var _this = this;
var possibleUsername = username (suffix || '');
_this.findOne({
username: possibleUsername
}, function(err, user) {
if (!err) {
if (!user) {
callback(possibleUsername);
} else {
return _this.findUniqueUsername(username, (suffix || 0) 1, callback);
}
} else {
callback(null);
}
});
};
mongoose.model('User', UserSchema);
Комментарии:
1. В каком файле вы объявляете свою scema и модель mongoose? Можете ли вы опубликовать этот код?
2. Прямо сейчас это очень близко к шаблону для пользовательской модели, которая mean.js настраивается. Это объявлено в user.server.model.js файл. Я добавлю вопрос с кодом.
3. Попробуйте экспортировать
mongoose.model('User', UserSchema);
и использовать это в качестве своей модели.4. Я не уверен, что понимаю в этом вопросе, прямо сейчас последняя строка файла модели пользователя — это именно эта строка, и она должна нормально ее зарегистрировать оттуда. Я получаю ошибку только тогда, когда пытаюсь запросить этот файл из его исходного местоположения, но никаких ошибок, когда я запрашиваю его из копии в той же папке, что и запущенное приложение.
5. Попробуйте изменить последнюю строку на
module.exports=mongoose.model('User', UserSchema);
Затем изменитеvar User = mongoose.model('User');
наvar User = require('<path to your User file>');
. Дайте мне знать, как это происходит.
Ответ №1:
Измените последнюю строку на module.exports=mongoose.model('User', UserSchema);
Затем измените var User = mongoose.model('User');
на var User = require('<path to your User file>');
.
Комментарии:
1. При дальнейшем тестировании это не работает. Я получаю объект User, но, похоже, у него нет никакого доступа к базе данных. Я могу запросить объект в mongoose, но я не получаю действительных ответов. Опять же, когда я включаю тот же код из локальной папки, он работает отлично.
2. @Geek42 Я почти уверен, что это должно сработать. Можете ли вы опубликовать пример проекта?