2017-05-29 35 views
0

我目前正在从我的Node js应用程序中从mongodb迁移到MySQL。我使用续集作为ORM,但我在迁移一些passportjs代码时遇到了一些麻烦。Ssequelizejs,MySQL和passportjs user.findOne不是函数

我有以下模式。

user.js的:

"use strict"; 

module.exports = function(sequelize, DataTypes) { 
    var User = sequelize.define("users", { 
    username: DataTypes.STRING, 
    localemail: DataTypes.STRING, 
    localpassword: DataTypes.STRING, 
    facebookid: DataTypes.STRING, 
    facebooktoken: DataTypes.STRING, 
    facebookemail: DataTypes.STRING, 
    facebookname: DataTypes.STRING, 
    twitterid: DataTypes.STRING, 
    twittertoken: DataTypes.STRING, 
    twitterdisplayname: DataTypes.STRING, 
    twitterusername: DataTypes.STRING, 
    googleid: DataTypes.STRING, 
    googletoken: DataTypes.STRING, 
    googleemail: DataTypes.STRING, 
    googlename: DataTypes.STRING 
    }); 

    return User; 
}; 

而在我passportjs文件中的以下功能:

...

// load all the things we need 
var LocalStrategy = require('passport-local').Strategy; 
var FacebookStrategy = require('passport-facebook').Strategy; 
var TwitterStrategy = require('passport-twitter').Strategy; 
var GoogleStrategy = require('passport-google-oauth').OAuth2Strategy; 

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

...

passport.use('local-login', new LocalStrategy({ 
     usernameField : 'email', 
     passwordField : 'password', 
     passReqToCallback : true 
    }, 
    function(req, email, password, done) { 
     if (email) 
      email = email.toLowerCase(); 
    // asynchronous 
    process.nextTick(function() { 
     User.findOne({ 
      where: { 
       localemail: email 
      } 
     }).then(function(user) { 
      // if there are any errors, return the error 
      if (err) 
       return done(err); 

      // if no user is found, return the message 
      if (!user) 
       return done(null, false, req.flash('loginMessage', 'No user found.')); 

      if (!validPassword(password)) 
       return done(null, false, req.flash('loginMessage', 'Oops! Wrong password.')); 

      // all is well, return user 
      else 
       return done(null, user); 
     }); 
    }); 

})); 

.. 。

的应用程序退出,出现以下错误:

passport.js:100 
        User.findOne({ 
         ^

TypeError: User.findOne is not a function 

我已经看过这段代码在GitHub上的灵感:

https://github.com/sequelize/express-example

任何想法,我俯瞰什么?

UPDATE:

所以在我passport.js文件我已经做到了这一点:

var models = require('../models'); 
console.log("models.User:" +models.User); 

其输出这样的:

npm start app.js 
> myapp0.0.0 start /home/mathias/nodejs/myapp 
> DEBUG=express-sequelize 
node ./bin/www "app.js" 
models.User:undefined 
express-sequelize 
Express server listening on port 3000 +0ms express-sequelize 
Listening on port 3000 +7ms – 

这给出了一个[对象:对象]中控制台:

var models = require('../models'); 
console.log("models:" +models); 

的这也给未定义:

var models = require('../models').User; 
console.log("models:" +models); 

更新与config.json文件:

{ 
    "development": { 
    "username": "root", 
    "password": "password", 
    "database": "myapp", 
    "host": "0.0.0.0", 
    "dialect": "mysql" 
    }, 
    "test": { 
    "username": "root", 
    "password": "password", 
    "database": "myapp", 
    "host": "0.0.0.0", 
    "dialect": "mysql" 
    }, 
    "production": { 
    "username": "root", 
    "password": "password", 
    "database": "myapp", 
    "host": "0.0.0.0", 
    "dialect": "mysql" 
    } 
} 
+0

'user.js'出口返回模型的功能,所以在导入该功能后,您需要调用它(使用正确的参数)并且返回值将是'User'模型。 – robertklep

+0

嗨robertklep我试着用var models = require('../ models')。没有运气。任何我可能忽略的东西? – Tony

回答

0

文件user.js出口返回模型的函数:

module.exports = function(sequelize, DataTypes) { 
    ... 
    return User; 
} 

因此,为了得到该模型的参考,则需要使用这样的事情:

const Sequelize = require('sequelize'); 
const DataTypes = sequelize.DataTypes; 

let sequelize = new Sequelize(...); 

const User = require('../models/user')(sequelize, DataTypes); 

不过,我不明白你为什么会想通过sequelizeDataTypes身边,因为你可以很容易地将它们导入模型文件(这反过来,可以直接导出模型):

// models/user.js 
const sequelize = require('sequelize'); 
const DataTypes = sequelize.DataTypes; 

module.exports = sequelize.define("users", { ... }); 

要使用:

const User = require('../models/user'); 

+0

所以对我的代码产生最小的影响,我从第一个例子开始,在这个例子中,我传递了sequelize和DataTypes,当它工作的时候,我会实现你描述的更简单的模型,这样做更有意义,因此user.js仍然看起来像在我的原始上面的问题。实现你描述给我的passport.js文件的改变会在控制台中给出以下错误:/home/tony/code/myapp/models/user.js:4 var User = sequelize.define(“users”,{ ^ TypeError:sequelize.define不是函数 – Tony

+0

@Tony哦我认为我误解了代码,'sequelize'不是模块引用,而是数据库实例(所以'new Sequelize(...)在这种情况下,你可能仍然需要传递它,我会更新我的答案 – robertklep

+0

非常感谢你的帮助!现在编译代码。不幸的是我尝试使用路由登录时收到错误:未处理的拒绝SequelizeAccessDeniedError:ER_ACCESS_DENIED_ERROR:拒绝用户'@'localhost'的访问(使用密码:NO)我想这可能是,因为我的config.json文件,我已经添加到原点al问题。 – Tony

2

问题是你如何要求的模块。替换:

var User  = require('../models/user'); 

有了这个:

var User = require('../models').User; 

这是这样的,因为方式的模型是动态出口。你可以看看你的文件models/index.js。在那里你会发现每个模型如何导出到单个对象中。所以你基本上总是需要模型/索引。JS有指定要哪个键来访问,在这种情况下,“用户”

+0

它似乎没有工作(我得到同样的错误),你说...“所以你基本上总是需要模型/ index.js”...这是否意味着我需要要求(” ../models/index.js');?如果是这样,我应该调用什么变量(我猜其他一些代码应该能够引用它)? – Tony

+0

如果您未指定密钥,则可以将其称为“模型”。如果您按照我的回复方式指定了密钥,则可以将其称为“用户”或任何其他密码。向我展示一个包含模型内容的pastebin/index.js – yBrodsky

+0

https://pastebin.com/6DxB0DpW – Tony