Ssequelizejs、MySQL 和 Passportjs user.findOne 不是函数

Ton*_*ony 3 mysql node.js sequelize.js passport.js

我目前正在 Node js 应用程序中从 mongodb 迁移到 MySQL。我使用sequelize作为ORM,但是我在迁移一些passportjs代码时遇到了一些麻烦。

\n\n

我有以下模式。

\n\n

用户.js:

\n\n
"use strict";\n\nmodule.exports = function(sequelize, DataTypes) {\n  var User = sequelize.define("users", {\n    username: DataTypes.STRING,\n    localemail: DataTypes.STRING,\n    localpassword: DataTypes.STRING,\n    facebookid: DataTypes.STRING,\n    facebooktoken: DataTypes.STRING,\n    facebookemail: DataTypes.STRING,\n    facebookname: DataTypes.STRING,\n    twitterid: DataTypes.STRING,\n    twittertoken: DataTypes.STRING,\n    twitterdisplayname: DataTypes.STRING,\n    twitterusername: DataTypes.STRING,\n    googleid: DataTypes.STRING,\n    googletoken: DataTypes.STRING,\n    googleemail: DataTypes.STRING,\n    googlename: DataTypes.STRING\n  });\n\n  return User;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

我的 Passportjs 文件中有以下函数:

\n\n

...

\n\n
// load all the things we need\nvar LocalStrategy    = require(\'passport-local\').Strategy;\nvar FacebookStrategy = require(\'passport-facebook\').Strategy;\nvar TwitterStrategy  = require(\'passport-twitter\').Strategy;\nvar GoogleStrategy   = require(\'passport-google-oauth\').OAuth2Strategy;\n\n// load up the user model\nvar User       = require(\'../models/user\');\n
Run Code Online (Sandbox Code Playgroud)\n\n

...

\n\n
passport.use(\'local-login\', new LocalStrategy({\n        usernameField : \'email\',\n        passwordField : \'password\',\n        passReqToCallback : true \n    },\n    function(req, email, password, done) {\n        if (email)\n            email = email.toLowerCase(); \n    // asynchronous\n    process.nextTick(function() {\n        User.findOne({\n            where: {\n                localemail: email\n            }\n        }).then(function(user) {\n            // if there are any errors, return the error\n            if (err)\n                return done(err);\n\n            // if no user is found, return the message\n            if (!user)\n                return done(null, false, req.flash(\'loginMessage\', \'No user found.\'));\n\n            if (!validPassword(password))\n                return done(null, false, req.flash(\'loginMessage\', \'Oops! Wrong password.\'));\n\n            // all is well, return user\n            else\n                return done(null, user);\n        });\n    });\n\n}));\n
Run Code Online (Sandbox Code Playgroud)\n\n

...

\n\n

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

\n\n
passport.js:100\n                    User.findOne({\n                         ^\n\nTypeError: User.findOne is not a function\n
Run Code Online (Sandbox Code Playgroud)\n\n

我在 github 上查看了这段代码以获取灵感:

\n\n

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

\n\n

对我所忽略的有什么想法吗?

\n\n

更新:

\n\n

所以在我的 Passport.js 文件中我这样做了:

\n\n
var models = require(\'../models\'); \nconsole.log("models.User:" +models.User); \n
Run Code Online (Sandbox Code Playgroud)\n\n

输出如下:

\n\n
npm start app.js \n> myapp0.0.0 start /home/mathias/nodejs/myapp \n> DEBUG=express-sequelize \nnode ./bin/www "app.js" \nmodels.User:undefined \nexpress-sequelize \nExpress server listening on port 3000 +0ms express-sequelize \nListening on port 3000 +7ms \xe2\x80\x93\n
Run Code Online (Sandbox Code Playgroud)\n\n

这会在控制台中给出一个 [object:object]:

\n\n
var models  = require(\'../models\');\nconsole.log("models:" +models);\n
Run Code Online (Sandbox Code Playgroud)\n\n

这也给出了一个未定义的:

\n\n
var models  = require(\'../models\').User;\nconsole.log("models:" +models);\n
Run Code Online (Sandbox Code Playgroud)\n\n

使用 config.json 文件更新:

\n\n
{\n  "development": {\n    "username": "root",\n    "password": "password",\n    "database": "myapp",\n    "host": "0.0.0.0",\n    "dialect": "mysql"\n  },\n  "test": {\n    "username": "root",\n    "password": "password",\n    "database": "myapp",\n    "host": "0.0.0.0",\n    "dialect": "mysql"\n  },\n  "production": {\n    "username": "root",\n    "password": "password",\n    "database": "myapp",\n    "host": "0.0.0.0",\n    "dialect": "mysql"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

yBr*_*sky 7

问题是你如何需要该模块。代替:

var User = require('../models/user');
Run Code Online (Sandbox Code Playgroud)

有了这个:

var User = require('../models').User;
Run Code Online (Sandbox Code Playgroud)

之所以会出现这样的情况,是因为模型是动态导出的。您可以查看您的文件 models/index.js。在那里您将了解如何将每个模型导出到单个对象中。所以你基本上总是需要 models/index.js 并指定你想要访问哪个键,在本例中为“User”