Node.js 凭护照及;使用Sequelize进行保存不会';t工作(意外的';';)

Node.js 凭护照及;使用Sequelize进行保存不会';t工作(意外的';';),node.js,sequelize.js,passport.js,postman,Node.js,Sequelize.js,Passport.js,Postman,我对Node.js项目的passport和sequelize有一些问题。 事实上,当我想注册时,我正在使用postman调用/users/signup路由,它显示:意外的“”和: 代码如下: /* CREATE an account */ app.post('/users/signup', (req, res) => { db.users.find({ $or: [{ email: req.body.email }, { username: req.body.userna

我对Node.js项目的passport和sequelize有一些问题。 事实上,当我想注册时,我正在使用postman调用/users/signup路由,它显示:意外的“”和:

代码如下:

/* CREATE an account */
  app.post('/users/signup', (req, res) => {

      db.users.find({ $or: [{ email: req.body.email }, { username: req.body.username }] }).then(user => {

  if (err) {
    return res.send(err);
  }
  if (user) {
    if (user.email == req.body.email) {
      return res.send("This email is already taken.")
    }
    return res.send("This username is already taken.")
  }
  else {

    const data = {
      username: req.body.username,
      name: req.body.name,
      firstname: req.body.firstname,
      email: req.body.email,
      location: req.body.location,
      type: req.body.type,
      password: req.body.password
    };

    db.users.create({
      username: data.username,
      name: data.name,
      firstname: data.firstname,
      email: data.email,
      location: data.location,
      type: data.type,
      password: data.password

    }).then(newUser => {
      res.send("newUser saved to database")
      // `req.user` contains the authenticated user.
      //TODO : res.redirect('/profile/' + req.body.username);
    })
      .catch(err => {
        console.log(err);
        res.status(400).send("unable to save this newUser to database");
      })

  }

}).catch(err => {
  console.log(err);
  res.status(400).send("signup failed");
})
})

和我的模型(db.users):

我的护照.js

// load all the things we need
var LocalStrategy = require('passport-local').Strategy;
var db = require('../db')

// expose this function to our app using module.exports
module.exports = function (passport) {

    var User = db.users;
    // =========================================================================
    // passport session setup ==================================================
    // =========================================================================
    // required for persistent login sessions
    // passport needs ability to serialize and unserialize users out of session

    // used to serialize the user for the session
    passport.serializeUser(function (user, done) {
        done(null, user.id);
    });

// used to deserialize the user
passport.deserializeUser(function (id, done) {
    User.find({
        where: { user_id: user_id }
    })
        .then(function (user) {
            done(err, user);
        }).catch(function (err) {
            return done(err);
        })
});


    // =========================================================================
    // LOCAL LOGIN =============================================================
    // =========================================================================
    // we are using named strategies since we have one for login and one for signup
    // by default, if there was no name, it would just be called 'local'

    passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true // allows us to pass back the entire request to the callback
    },
        function (req, email, password, done) { // callback with email and password from our form

            // find a user whose email is the same as the forms email
            // we are checking to see if the user trying to login already exists
            User.findOne({ email : email }, function (err, user) {
                // if there are any errors, return the error before anything else
                if (err)
                    return done(err);

                // if no user is found, return the message
                if (!user)
                    return done(null, false, { message: 'User not found.' }); // req.flash is the way to set flashdata using connect-flash
                // if the user is found but the password is wrong
                if (!user.validPassword(password))
                    return done(null, false, { message: 'Incorrect password.' }); // create the loginMessage and save it to session as flashdata

                // all is well, return successful user
                return done(null, user);
            });

        }));

};

我找不到问题的根源。我刚接触Node.js,几个小时后就被卡住了。这里有人能帮我吗

经过讨论,我们发现第一个错误来自用户db模型上的
beforeSave
钩子,其中使用的哈希函数缺少一个
null
参数作为第三个参数,因此bcrypt抛出了一个“无回调通过”错误。还有其他一些问题,比如承诺和回调的错误使用,我建议学习承诺,并仔细检查文档和示例,了解如何使用这些库,比如Sequelize和bcrypt(例如如何生成和使用salt)


先前的答复 我认为问题来自您的“本地登录”策略:passport使用回调,而sequelize使用承诺,因此您的
User.findOne
回调永远不会被调用。试试这样:

app.post("/users/signup", (req, res) => {
  return db.users
    .find({
      $or: [
        {
          email: req.body.email
        },
        {
          username: req.body.username
        }
      ]
    })
    .then(user => {
      if (user) {
        if (user.email == req.body.email) {
          return res.send("This email is already taken.");
        }
        return res.send("This username is already taken.");
      } else {
        return db.users
          .create({
            username: req.body.username,
            name: req.body.name,
            firstname: req.body.firstname,
            email: req.body.email,
            location: req.body.location,
            type: req.body.type,
            password: req.body.password
          })
          .then(newUser => {
            res.send("newUser saved to database");
          });
      }
    })
    .catch(err => {
      console.error(err);
      res.status(400).send("unable to save this newUser to database");
    });
});
路由和反序列化的情况也是如此: app.post('/users/signup',(req,res)=>{


更新。在使用sequelize模型进行查询时,您应该在任何地方使用Promissions。您是为db.users.create做的,但不是为db.users.find做的,因此您永远不会得到要查找的答案。在使用完整逻辑之前,您应该尝试使用一个简单的功能。尝试只使用一个post端点,创建一个用户并返回它。之后,您将我将重点确保用户还不存在,然后您将检查passport策略。更新了一个路由应如何工作的示例。服务器的日志显示了什么?让我们看看。
// load all the things we need
var LocalStrategy = require('passport-local').Strategy;
var db = require('../db')

// expose this function to our app using module.exports
module.exports = function (passport) {

    var User = db.users;
    // =========================================================================
    // passport session setup ==================================================
    // =========================================================================
    // required for persistent login sessions
    // passport needs ability to serialize and unserialize users out of session

    // used to serialize the user for the session
    passport.serializeUser(function (user, done) {
        done(null, user.id);
    });

// used to deserialize the user
passport.deserializeUser(function (id, done) {
    User.find({
        where: { user_id: user_id }
    })
        .then(function (user) {
            done(err, user);
        }).catch(function (err) {
            return done(err);
        })
});


    // =========================================================================
    // LOCAL LOGIN =============================================================
    // =========================================================================
    // we are using named strategies since we have one for login and one for signup
    // by default, if there was no name, it would just be called 'local'

    passport.use('local-login', new LocalStrategy({
        // by default, local strategy uses username and password, we will override with email
        usernameField: 'email',
        passwordField: 'password',
        passReqToCallback: true // allows us to pass back the entire request to the callback
    },
        function (req, email, password, done) { // callback with email and password from our form

            // find a user whose email is the same as the forms email
            // we are checking to see if the user trying to login already exists
            User.findOne({ email : email }, function (err, user) {
                // if there are any errors, return the error before anything else
                if (err)
                    return done(err);

                // if no user is found, return the message
                if (!user)
                    return done(null, false, { message: 'User not found.' }); // req.flash is the way to set flashdata using connect-flash
                // if the user is found but the password is wrong
                if (!user.validPassword(password))
                    return done(null, false, { message: 'Incorrect password.' }); // create the loginMessage and save it to session as flashdata

                // all is well, return successful user
                return done(null, user);
            });

        }));

};
app.post("/users/signup", (req, res) => {
  return db.users
    .find({
      $or: [
        {
          email: req.body.email
        },
        {
          username: req.body.username
        }
      ]
    })
    .then(user => {
      if (user) {
        if (user.email == req.body.email) {
          return res.send("This email is already taken.");
        }
        return res.send("This username is already taken.");
      } else {
        return db.users
          .create({
            username: req.body.username,
            name: req.body.name,
            firstname: req.body.firstname,
            email: req.body.email,
            location: req.body.location,
            type: req.body.type,
            password: req.body.password
          })
          .then(newUser => {
            res.send("newUser saved to database");
          });
      }
    })
    .catch(err => {
      console.error(err);
      res.status(400).send("unable to save this newUser to database");
    });
});
db.users.find({ $or: [{ email: req.body.email }, { username: req.body.username }] })
    .then(user=>{})
    .catch(err=>{})