mysql - 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
解决方案
当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) { }
推荐阅读
- filter - Swagger 如何启用按标签过滤不区分大小写
- python - 根据时间戳将行合并到熊猫中的单行
- javascript - NgxDatetimeRangePickerModule 的浏览器模块错误
- java - 将布局管理器与 JPanel 和 Graphics 2D 一起使用
- ios - Facebook Ads 是否可以在不使用 IDFA 的情况下跟踪 iOS 应用安装?
- python - 有没有一种快速的方法可以将 mp3 文件与 python 中的 mp4 文件结合起来?
- python - 无法多次使用 tensorflow 会话的功能
- angular - 如何根据条件禁用 CDK Drop
- python - ImportError:无法导入名称“pywrap_tensorflow”
- javascript - 调用 GraphQL 突变的 If/Else 条件