Ошибка Mongoose при загрузке файлов модели из параллельного Mean.js проект с использованием require

#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 Я почти уверен, что это должно сработать. Можете ли вы опубликовать пример проекта?