首页 > 解决方案 > User.findOne 不是 knexjs (postgresql) 的函数

问题描述

我正在尝试使用护照,但我的代码中出现此错误

TypeError: User.findOne is not a function

我关注了 passport.js 中的文档,这是我的代码

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 有不同的 sequelizerjs 使用,但 passportjs 文档仅适用于 mongoos ,所以有人可以帮助我理解我的代码中的问题以及我缺少的内容以及是否有使用 kenxjs 为 psql 使用 sequelize 的好文档

在四处寻找一些有用的信息后,我将我的代码更新为:但我仍然不知道它是如何工作的,所以有人可以让我正确地通过:

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"
}

标签: knex.jsbookshelf.js

解决方案


在这里,用户在使用knex.js/bookshelf.js执行findOne()方法时收到的错误消息仅仅是因为它是在 MongoDB 数据库中查找(一个)元素的 Moongoose 方法,而不是 knex/bookshelf 方法。

仅供参考:knex 中的等价物是

knex.select('token_column_value')
    .from('user_table')
    .where({ apikey: 'apikey' });

或者他们的文档中提到的任何示例,其中解释了选择语法:

https://knexjs.org/#Builder-select


推荐阅读