我正在尝试使用护照,但我的代码中有这个错误
TypeError: User.findOne is not a function
我跟踪了passport.js中的docs,这是我的代码
const HeaderAPIKeyStrategy = require('passport-headerapikey').HeaderAPIKeyStrategy
const knexDb = knex({ client: 'pg', connection: {
host : process.env.HOST,
user : process.env.USER,
password : process.env.PASSWORD,
database : process.env.DATABASE,
port: process.env.PORT
}});
const bookshelf = require('bookshelf');
const securePassword = require('bookshelf-secure-password');
const db = bookshelf(knexDb);
db.plugin(securePassword);
const User = db.Model.extend({
tableName: 'users',
hasSecurePassword: true
});
passport.use(new HeaderAPIKeyStrategy(
{ header: 'Authorization', prefix: 'Api-Key ' },
false,
function(apikey, done) {
console.log(apikey)
User.findOne({ apikey: apikey }, function (err, user) {
if (err) { return done(err); }
if (!user) { return done(null, false); }
return done(null, user);
});
}
));
app.post('/api/authenticate',
passport.authenticate('headerapikey', { session: false }),
(req, res) => {
res.json({ message: "Authenticated" })
});
我读过关于knexjs和postgresql的文章,我认为psql有不同的后遗症,但passportjs文档只用于mongoos,所以有人能帮助我理解我的代码中的问题以及我所缺少的东西,以及如果有一个好的文档可用于psql,用于使用kenxjs的代码。
在四处寻找一些有用的信息后,我更新了我的代码如下:但我仍然不知道它是如何工作的,所以有人能让我正确地通过:
passport.use(new HeaderAPIKeyStrategy(
{ header: 'Authorization', prefix: 'Api-Key ' },
false,
function(apikey, done) {
console.log(apikey)
User.forge().where({ apikey: apikey }).fetch().then((user) => {
// console.log('err', err)
console.log('user', user)
done(null, user);
});
// User.findOne({ apikey: apikey }, function (err, user) {
// console.log('err', err)
// console.log('user', user)
// if (err) { return done(err); }
// if (!user) { return done(null, false); }
// return done(null, user);
// });
}
));
但是现在当我res.json(req.body)
的时候,我得到了这样的回应
{
"token": "jfaskdl"
}
发布于 2020-11-18 03:10:56
在这里,用户在使用knex.js/bookshelf.js执行findOne()
方法时获得的错误消息仅仅是因为--在MongoDB数据库中查找(一个)元素是一种方法,而不是knex/书架方法.。
FYI :与knex相对应的是
knex.select('token_column_value')
.from('user_table')
.where({ apikey: 'apikey' });
或者文档中提到的解释select语法的任何示例:
https://stackoverflow.com/questions/54840432
复制