Sequelize - findOne().success() 未定义

Posted

技术标签:

【中文标题】Sequelize - findOne().success() 未定义【英文标题】:Sequelize - findOne().success() is undefined 【发布时间】:2015-11-19 16:27:07 【问题描述】:

我正在关注 passport.js 文档,以便使用 Sequelize 作为我的 postgres 数据库的 ORM 创建 LocalStrategy。但是,在身份验证期间,在我的 login.js 模块中执行 User.findOne(...).success(function(user)...]); 会返回 undefined。我做错了什么?

user.js:

var pg = require('pg');
var Sequelize = require('sequelize');

var sequelize = new Sequelize('database', 'username', 'password', 
    host: 'localhost',
    port: 5432,
    dialect: 'postgres'
);

var User = sequelize.define('users', 
    username: Sequelize.STRING,
    password: Sequelize.STRING

);

User.sync();

module.exports = User;

我的 login.js(路由器)

var express = require('express');
var router = express.Router();
var passport = require('passport');
var LocalStrategy = require('passport-local').Strategy;


passport.serializeUser(function(user, done)
    done(null, user.id);
);

passport.deserializeUser(function(id, done)
    console.log(id)
    User.findById(id, function(err, user)
        done(err, user);
    );
);

passport.use(new LocalStrategy(
    function(username, password, done)
        var User = require('../models/user');
        User.find(where:username: username, password: password).success(function(user)
            if(!user) 
                return done(null, false, message: 'Nom d\'usager incorrect.' );
            
            if (!user.validPassword(password)) 
                return done(null, false,  message: 'Mot de passe incorrect.' );
            
            return done(null, user);
        );
    
));

router.post('/login', passport.authenticate('local',  successRedirect: '/decoupage',
                                                       failureRedirect: '/login',
                                                       failureFlash: true )
);


module.exports = router;

【问题讨论】:

您应该接受@robertklep 的正确答案。 【参考方案1】:

Sequelize 使用 bluebird 承诺库的修改版本,它没有 .success() 函数。

改为使用.then()(也遵循Promises/A+ 标准):

User.find(options).then(
  function(user)  ... ,
  function(err)  ... 
);

【讨论】:

@abhishek,sequelize 的当前版本使用bluebird 的库存版本。要捕获错误,请使用 .catch.error。可以在here找到文档。

以上是关于Sequelize - findOne().success() 未定义的主要内容,如果未能解决你的问题,请参考以下文章

[usedIf在数据库中时,sequelize findOne找不到用户标识

将属性添加到 Sequelize FindOne 返回的对象

在使用急切加载的 findOne Sequelize 方法期间,Nodejs 堆内存不足

Sequelize 中的 WhereHas 方法

SQL Server 的 Sequelize 事务隔离级别问题

Node.js学习10~Sequelize基本sql学习