2017-05-29 27 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