首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >User.findOne不是knexjs (postgresql)的函数。

User.findOne不是knexjs (postgresql)的函数。
EN

Stack Overflow用户
提问于 2019-02-23 10:00:45
回答 1查看 1.7K关注 0票数 0

我正在尝试使用护照,但我的代码中有这个错误

代码语言:javascript
运行
复制
TypeError: User.findOne is not a function

我跟踪了passport.js中的docs,这是我的代码

代码语言:javascript
运行
复制
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的代码。

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

代码语言:javascript
运行
复制
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)的时候,我得到了这样的回应

代码语言:javascript
运行
复制
{
    "token": "jfaskdl"
}
EN

回答 1

Stack Overflow用户

发布于 2020-11-18 11:10:56

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

FYI :与knex相对应的是

代码语言:javascript
运行
复制
knex.select('token_column_value')
    .from('user_table')
    .where({ apikey: 'apikey' });

或者文档中提到的解释select语法的任何示例:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54840432

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档