首页 > 解决方案 > Node js - 插入数据库后完成不是一个函数

问题描述

我第一次尝试在节点 js 中进行身份验证。数据库中的插入正在工作,但我遇到了有关完成功能的问题,我不明白为什么。这肯定是一个简单的答案,但我仍然是节点的初学者。我使用 express 和 passeport 进行身份验证。

我的代码:

// DB
var LocalStrategy = require("passport-       local").Strategy;
var mysql = require('mysql');
var bcrypt = require('bcrypt-nodejs');
var dbconfig = require('./database');
var connection =     mysql.createConnection(dbconfig.connection);

// BD PASSEPORT
connection.query('USE ' + dbconfig.database);

module.exports = function (passport) {
passport.serializeUser(function (user, done) {
    done(null, user.id);
});

passport.deserializeUser(function (id, done) {
    connection.query("SELECT * FROM client WHERE id = ? ", [id],
        function (err, rows) {
            done(err, rows[0]);
        });
});

passport.use(
    'local-signup',
    new LocalStrategy({
        usernameField: 'username',
        mailField: 'mail',
        passwordField: 'password',
        passReqToCallback: true
    },
        function (req, username, mail, password, done) {
            connection.query("SELECT * FROM client WHERE username = ? ",
                [username], function (err, rows) {
                    if (err)
                        return done(err);
                    if (rows.length) {
                        return done(null, false, req.flash('signupMessage', 'That is already taken'));
                    } else {
                        var newUserMysql = {
                            username: username,
                            mail: mail,
                            password: bcrypt.hashSync(password, null, null)
                        };
                        
                        var insertQuery = "INSERT INTO client (username, mail, password) values (?, ?, ?)";

                        connection.query(insertQuery, [newUserMysql.username, newUserMysql.mail, newUserMysql.password],
                            function (err, rows) {
                                newUserMysql.id = rows.insertId;
 console.log(newUserMysql);
                                return done(null, newUserMysql);
                            });
                    }
                });
        })
);

问题是最后完成的功能:

输出

  {
  username: 'eazeazea',
  mail: 'eazeazeaze',
  password:    '$2a$10$iUOYeqzQqV6hJ.WvYMom8uesUxxtKpKfdb8GcoJ4Chkv ka.FIZfiO',
  id: 20
  }
   D:\Projets\group-780053\node_modules\mysql  \lib\protocol\Parser.js:437
   throw err; // Rethrow non-MySQL errors
   ^

  TypeError: done is not a function
  at Query.<anonymous> (D:\Projets\group-780053    \config\passport.js:51:44)
  at Query.<anonymous> (D:\Projets\group-780053  \node_modules\mysql\lib\Connection.js:526:10)
  at Query._callback (D:\Projets\group-780053\node_modules\mysql\lib\Connection.js:488:16)
  at Query.Sequence.end (D:\Projets\group-780053\node_modules\mysql\lib\protocol\sequences\Sequence.js:83:24)
  at Query._handleFinalResultPacket (D:\Projets\group-780053\node_modules\mysql\lib\protocol\sequences\Query.js:149:8)
  at Query.OkPacket (D:\Projets\group-780053\node_modules\mysql\lib\protocol\sequences\Query.js:74:10)
  at Protocol._parsePacket (D:\Projets\group-780053\node_modules\mysql\lib\protocol\Protocol.js:291:23)
   at Parser._parsePacket (D:\Projets\group-780053\node_modules\mysql\lib\protocol\Parser.js:433:10)
   at Parser.write (D:\Projets\group-780053\node_modules\mysql\lib\protocol\Parser.js:43:10)
   at Protocol.write (D:\Projets\group-780053\node_modules\mysql\lib\protocol\Protocol.js:38:16)
 npm ERR! code ELIFECYCLE
 npm ERR! errno 1
 npm ERR! node-loginregister@ start: `node  ./server`
 npm ERR! Exit status 1
 npm ERR!
 npm ERR! Failed at the node-loginregister@  start script.
 npm ERR! This is probably not a problem with    npm. There is likely additional logging output   above.

  npm ERR! A complete log of this run can be found in:
  npm ERR!     C:\Users\Nicol\AppData\Roaming\npm-cache\_logs\2020-07-16T10_30_48_382Z-debug.log

标签: mysqlnode.js

解决方案


passport.use用于重命名策略签名时,是这样的

passport.use('new-name', new LocalStrategy(options, (req, email, password, done) => {
     // ....
}))

更具体地说,您的示例应该如下所示。

passport.use('local-signup', new LocalStrategy({
    usernameField: 'username',
    passwordField: 'password',
    passReqToCallback: true
}, function((req, email, password, next) {
    // ...
})));

但是在您的情况下,您传递了5 个参数,done在您的情况下命名的参数是第五个参数。当护照将调用在护照本地源verify代码中命名的方法函数时

它将仅传递 4 个参数,它们不会是任何 50 个参数,因此它将是未定义的。

您的代码只是意味着您正在尝试将参数传递给undefined显然会通过错误。解决您将进行此更改的问题

替换这一行

function (req, username, mail, password, done) { }

function (req, email, password, done) { }

推荐阅读