【问题标题】:cannot find module '../app/models/user'找不到模块“../app/models/user”
【发布时间】:2017-05-14 05:19:08
【问题描述】:

我在这个问题上挣扎了超过 40 个小时,但仍然不知道如何解决这个问题,这个问题有点大,但我会尽力而为,我是 Node.Js 和 mongo 东西的小新手所以请原谅我任何愚蠢的错误。

我遵循 Mean Stack 这本书,当我开始 this 教程使用 auth 进行身份验证时,问题出现了,我一开始是在没有任何社交的情况下进行本地身份验证。

文件夹结构

所以基本上我这样设置服务器:

process.env.NODE_ENV = process.env.NODE_ENV || 'development';
var mongoose = require('./config/mongoose');
var express = require('./config/express');


var db = mongoose();
var app = express();
app.listen(3000);

module.exports = app;

console.log("running at port 3000");

这是 ./config/mongoose

var config = require('./config');
var mongoose = require('mongoose');
var connectionString = "mongodb://localhost:27017/ShareIdea"

module.exports = function(){
mongoose.Promise = global.Promise;
var db = mongoose.connect(connectionString);

require('../app/models/user.server.model');

return db;

};

所需的 user.server 模型

var mongoose = require('mongoose');
var bcrypt   = require('bcrypt-nodejs');
var Schema = mongoose.Schema;

var UserSchema = new Schema({
    local            : {
        email        : String,
        password     : String,
    },
    facebook         : {
        id           : String,
        token        : String,
        email        : String,
        name         : String
    },
    twitter          : {
        id           : String,
        token        : String,
        displayName  : String,
        username     : String
    },
    google           : {
        id           : String,
        token        : String,
        email        : String,
        name         : String
    }
    /*firstname:String,
    lastname:String,
    email:String,
    username:String,
    password:String,
    userChoice: {type: String, possibleValues: ['programmer','inovator']}*/
});

UserSchema.methods.generateHash = function(password) {
    return bcrypt.hashSync(password, bcrypt.genSaltSync(8), null);
};

UserSchema.methods.validPassword = function(password) {
    return bcrypt.compareSync(password, this.local.password);
};

mongoose.model('User',UserSchema);

这里是快速配置

var config          = require('./config');
var express         = require('express');
var passport        = require('passport');
var flash           = require('connect-flash');
var compress        = require('compression');
var cookieParser    = require('cookie-parser');
var session         = require('express-session');
var bodyParser      = require('body-parser');
var morgan          = require('morgan');
var methodOverride  = require('method-override');
var expressLayouts  = require('express-ejs-layouts');

module.exports = function(){
    var app = express();

    **require('./passport')(passport);**

    if(process.env.NODE_ENV === 'development')
    {
        app.use(morgan('dev'));
    }  
    else if(process.env.NODE_ENV === 'production')
    {
        app.use(compress());

    }
    app.use(cookieParser());

    app.use(bodyParser.urlencoded({
       extended:true 
    }));
    app.use(morgan('dev'));

    app.use(bodyParser.json());
    app.use(methodOverride());

    app.use(session({
        saveUninitialized: true,
        resave: true,
        secret: 'aaaaaaa'
    }));



    app.use(passport.initialize());
    app.use(passport.session()); // persistent login sessions
    app.use(flash());

    app.set('views', './app/views');
    app.set('view engine','ejs');
    app.use(expressLayouts);



    require('../app/routes/index.server.routes.js')(app,passport);
    require('../app/routes/register.server.routes.js')(app,passport);
    require('../app/routes/login.server.routes.js')(app,passport);
    require('../app/routes/profile.server.routes.js')(app,passport);
    app.use(express.static('./public'));
    return app;
}

这里是出现问题的地方,这一行是目前的主要问题:`require('./passport')(passport);

如果我输入这段代码,它会给我在标题中提到的问题,如果不是当我用我的表单发出 POST 请求时它从不发布,我有这个麻烦,因为我将代码的结构设置为 MVC结构和书一样,想把教程中的认证改编成我的代码学一点,

所以基本上我将护照传递给我的路线:`

注册路线

var register = require('../../app/controllers/register.server.controller');

module.exports = function(app,passport) {
 app.route('/register')
 .post(function(req,res){
     console.log("HY");
      passport.authenticate('local-signup', {
        successRedirect : '/profile', // redirect to the secure profile section
        failureRedirect : '/register', // redirect back to the signup page if there is an error
        failureFlash : true // allow flash messages
  })})
 .get(register.getPage);
};

注册控制器

var User = require('mongoose').model('User');

module.exports = {

  getPage: function(req,res){
      res.render('./pages/register',{ message: req.flash('signupMessage') });
  }

};

最后是护照代码:

// config/passport.js

// load all the things we need
var LocalStrategy   = require('passport-local').Strategy;

// load up the user model
var User            = require('../app/models/user');

// expose this function to our app using module.exports
module.exports = function(passport) {

    // =========================================================================
    // passport session setup ==================================================
    // =========================================================================
    // required for persistent login sessions
    // passport needs ability to serialize and unserialize users out of session

    // used to serialize the user for the session
    passport.serializeUser(function(user, done) {
        done(null, user.id);
    });

    // used to deserialize the user
    passport.deserializeUser(function(id, done) {
        User.findById(id, function(err, user) {
            done(err, user);
        });
    });

    // =========================================================================
    // LOCAL SIGNUP ============================================================
    // =========================================================================
    // we are using named strategies since we have one for login and one for signup
    // by default, if there was no name, it would just be called 'local'

    passport.use('local-signup', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField : 'email',
        passwordField : 'password',
        passReqToCallback : true // allows us to pass back the entire request to the callback
    },
    function(req, email, password, done) {

        // asynchronous
        // User.findOne wont fire unless data is sent back
        process.nextTick(function() {

        // find a user whose email is the same as the forms email
        // we are checking to see if the user trying to login already exists
        User.findOne({ 'local.email' :  email }, function(err, user) {
            // if there are any errors, return the error
            if (err)
                return done(err);

            // check to see if theres already a user with that email
            if (user) {
                return done(null, false, req.flash('signupMessage', 'That email is already taken.'));
            } else {

                // if there is no user with that email
                // create the user
                var newUser            = new User();

                // set the user's local credentials
                newUser.local.email    = email;
                newUser.local.password = newUser.generateHash(password);

                // save the user
                newUser.save(function(err) {
                    if (err)
                        throw err;
                    return done(null, newUser);
                });
            }

        });    

        });

    }));

};

Ps:抱歉发了这么长的帖子,希望能得到解释,因为我想了解更多,看书的时候感觉作者改编的mvc结构比较难,不过还是非常感谢。

如果你们不想看这个我明白,这里是 gitProject:git project

【问题讨论】:

    标签: node.js mongodb model-view-controller oauth passport.js


    【解决方案1】:

    在你的 user.server.model.js 文件中试试这个。而不仅仅是

    mongoose.model('User',UserSchema);

    试试下面这个让它可以访问。

    module.exports = { User : mongoose.model('User', UserSchema) }

    【讨论】:

    • 没用:/,我在上面的链接中有 github 上的项目,如果您可以快速查看,也许更容易发现问题,:/ 无论如何,谢谢
    猜你喜欢
    • 2018-02-12
    • 2021-12-28
    • 2017-06-07
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-25
    • 2020-04-14
    相关资源
    最近更新 更多