Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js Passport未根据请求公开login()函数_Node.js_Passport.js - Fatal编程技术网

Node.js Passport未根据请求公开login()函数

Node.js Passport未根据请求公开login()函数,node.js,passport.js,Node.js,Passport.js,在下面的代码中,当我记录请求对象(console.log('req',req))时,我无法在请求中找到login()方法。为什么这里的登录方法在请求中不可用 // Login User app.post('/login', (req, res, next) => { passport.authenticate('local', {}, (err, user, info) => { console.log('req', req) if (err

在下面的代码中,当我记录请求对象(
console.log('req',req)
)时,我无法在请求中找到login()方法。为什么这里的登录方法在请求中不可用

// Login User
app.post('/login', (req, res, next) => {
    passport.authenticate('local', {}, (err, user, info) => {
        console.log('req', req)

        if (err) throw err
        if (!user) console.log('User does not exist...')
        if (user) {
            console.log('user confirmed')
            req.logIn(user, next)
        }
    })(req, res, next);
    res.send('User logged in...')
});

中间件

app.use(express.json())
app.use(cors({ origin: ["http://localhost:3000", "http://localhost:3030"], credentials: true }))
app.use(session({
    name: 'bucketbadge:sess',
    secret: 'secretcat',
    resave: true,
    saveUninitialized: true,
    cookie: { secure: false }
}))

app.use(passport.initialize())
app.use(passport.session())

require('./config/passport-setup')
passport setup.js

passport.use(new LocalStrategy((username, password, done) => {
    User.findOne({ username: username }, (err, user) => {
        console.log('user in User.findOne', user)
        if (err) throw err;
        if (!user) return done(null, false);
        bcrypt.compare(password, user.password, (err, result) => {
            if (err) throw err
            if (result === true) {
                console.log('user:', user)
                return done(null, user);
            } else {
                return done(null, false);
            }
        })
    });
}
));

passport.serializeUser((user, done) => {
    console.log('user.id @ serializeUser:', user.id)
    done(null, user.id)
})

passport.deserializeUser((id, done) => {
    console.log('deserialize user:', id)

    User.findById(id, (err, user) => {
        done(err, user.id)
    });
});

每个Passport JS的文档

Passport在req
上公开一个
login()
函数(别名为login())
,可用于建立登录会话

req.login(user, function(err) {
  if (err) { return next(err); }
  return res.redirect('/users/' + req.user.username);
});
登录操作完成后,用户将被分配到
req.user.

注意:
passport.authenticate()
中间件自动调用
req.login()
。此函数主要在用户注册时使用,在此期间可以调用
req.login()
自动登录到新注册的用户


passport.authenticate()
中的请求中不应该有
login()
方法吗?

也许您对
console.log()
将向您展示的内容假设太多了。例如:

class Test {
    classMethod() { }
}
let object = new Test()
object.instanceMethod = () => { }

console.log(object)

//output
Test { instanceMethod: [Function (anonymous)] }  // no "classMethod" property here.
或:

这些只是几个简单的例子来说明这一点。我假设您同意,在这两种情况下,
classMethod
nonenumerable
属性实际上在输出的对象上可用

在您的例子中,
login
方法实际上不是在
req
对象本身上定义的,而是在其原型链的某个地方定义的

passport.authenticate('jwt', function (error, payload, info) {
  console.log("login" in req)
  console.log(req.hasOwnProperty("login"))
  console.log(findOwningObject(req, "login"))
  // ...
})

function findOwningObject(object, key) {
  if (object.hasOwnProperty(key)) {
    return object
  }

  var proto = Object.getPrototypeOf(object)
  if (!proto) throw new Error("Property not found")
  return findOwningObject(proto, key)
}

// output
true          // login property is available on req?
false         // login property is owned by req?
Readable {    // owning object for login.
  setTimeout: [Function: setTimeout],
  _read: [Function: _read],
  destroy: [Function: destroy],
  _addHeaderLines: [Function: _addHeaderLines],
  _addHeaderLine: [Function: _addHeaderLine],
  _dump: [Function: _dump],
  logIn: [Function (anonymous)],
  login: [Function (anonymous)],
  logOut: [Function (anonymous)],
  logout: [Function (anonymous)],
  isAuthenticated: [Function (anonymous)],
  isUnauthenticated: [Function (anonymous)]
}

谢谢你,我很高兴。。。您对console.log()的期望是正确的,这完美地回答了我的问题。非常感谢。
passport.authenticate('jwt', function (error, payload, info) {
  console.log("login" in req)
  console.log(req.hasOwnProperty("login"))
  console.log(findOwningObject(req, "login"))
  // ...
})

function findOwningObject(object, key) {
  if (object.hasOwnProperty(key)) {
    return object
  }

  var proto = Object.getPrototypeOf(object)
  if (!proto) throw new Error("Property not found")
  return findOwningObject(proto, key)
}

// output
true          // login property is available on req?
false         // login property is owned by req?
Readable {    // owning object for login.
  setTimeout: [Function: setTimeout],
  _read: [Function: _read],
  destroy: [Function: destroy],
  _addHeaderLines: [Function: _addHeaderLines],
  _addHeaderLine: [Function: _addHeaderLine],
  _dump: [Function: _dump],
  logIn: [Function (anonymous)],
  login: [Function (anonymous)],
  logOut: [Function (anonymous)],
  logout: [Function (anonymous)],
  isAuthenticated: [Function (anonymous)],
  isUnauthenticated: [Function (anonymous)]
}