【发布时间】:2023-03-19 11:39:01
【问题描述】:
我目前正在我的 Node js 应用程序中从 mongodb 迁移到 MySQL。我使用 sequelize 作为 ORM,但是在迁移一些 passportjs 代码时遇到了一些问题。
我有以下模态。
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
对我忽略的内容有什么想法吗?
更新:
所以在我的 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 –
这会在控制台中给出一个 [object:object]:
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"
}
}
【问题讨论】:
-
user.js导出一个返回模型的函数,因此在导入该函数后,您需要调用它(使用正确的参数),返回值将是User模型。 -
嗨 robertklep 我试过用 var models = require('../models').User;没有运气。我可能忽略了什么?
标签: mysql node.js passport.js sequelize.js