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};\nRun 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\');\nRun Code Online (Sandbox Code Playgroud)\n\n...
\n\npassport.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}));\nRun Code Online (Sandbox Code Playgroud)\n\n...
\n\n应用程序退出并出现以下错误:
\n\npassport.js:100\n User.findOne({\n ^\n\nTypeError: User.findOne is not a function\nRun Code Online (Sandbox Code Playgroud)\n\n我在 github 上查看了这段代码以获取灵感:
\n\nhttps://github.com/sequelize/express-example
\n\n对我所忽略的有什么想法吗?
\n\n更新:
\n\n所以在我的 Passport.js 文件中我这样做了:
\n\nvar models = require(\'../models\'); \nconsole.log("models.User:" +models.User); \nRun Code Online (Sandbox Code Playgroud)\n\n输出如下:
\n\nnpm 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\nRun Code Online (Sandbox Code Playgroud)\n\n这会在控制台中给出一个 [object:object]:
\n\nvar models = require(\'../models\');\nconsole.log("models:" +models);\nRun Code Online (Sandbox Code Playgroud)\n\n这也给出了一个未定义的:
\n\nvar models = require(\'../models\').User;\nconsole.log("models:" +models);\nRun 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}\nRun Code Online (Sandbox Code Playgroud)\n
问题是你如何需要该模块。代替:
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”
| 归档时间: |
|
| 查看次数: |
11645 次 |
| 最近记录: |