User.findOne不是knexjs的函数(PostgreSQL)

时间:2019-02-23 10:00:46

标签: knex.js bookshelf.js

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

TypeError: User.findOne is not a function

我关注了password.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,而mongoos仅使用了passwordjs文档,因此有人可以帮助我了解代码中的问题以及我所缺少的内容以及有一个很好的文档可以使用sequelize for 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"
}

1 个答案:

答案 0 :(得分:0)

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

仅供参考:与knex等效的

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

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

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