Estoy tratando de escribir un middleware de autorización de usuario. Uso esta función para validar y verificar la autorización más adelante.
He hecho yarn add express-jwt.
código auth.js:
const SECRET = 'secret-message'; const jwt = require('jsonwebtoken'); const expressJwt = require('express-jwt'); const compose = require('composable-middleware'); function sign(user) { return jwt.sign({ _id: user._id, }, SECRET, { expiresIn: 60 * 60 }); } function sendUnauthorized(req, res) { console.log(req.headers.authorization); console.log(req.user); res.status(401).json ({ message: 'Unathorized' }); }; const validateJwt = expressJwt({ secret: SECRET, fail: sendUnauthorized, getToken(req) { if (req.headers.authorization && req.headers.authorization.split(' ')[0] === 'Bearer') { return req.headers.authorization.split(' ')[1]; } else if (req.query && req.query.access_token) { return req.query.access_token; } return null; } });Y el error es:
const validateJwt = expressJwt({ ^ TypeError: expressJwt is not a functionEstoy atascado en este error y no puedo continuar. De verdad necesito algún consejo.
Como dice el error, expressJwt no es una función. El siguiente paso lógico sería verificar qué es en su lugar y, al mismo tiempo, volver a verificar su suposición de que es una función (¿por qué cree eso?) y buscar fuentes para eso, por ejemplo, revisando los documentos de el paquete.
Encontrará que a) es un objeto con { expressjwt: <some function here> } , y b) que los documentos muestran un ejemplo que usa la desestructuración ( var { expressjwt: jwt } = require('express-jwt') ) que no lo haces
Ambos hallazgos deberían señalarle el hecho de que su suposición de que la exportación predeterminada del módulo es una función es incorrecta y, en cambio, es un objeto con la propiedad expressjwt , que es la función que está buscando, por lo que podría arreglar su código usando la desestructuración en la importación de la siguiente manera:
const { expressjwt: expressJwt } = require('express-jwt'); (Alternativamente, usar expressJwt.expressjwt(...) también habría funcionado, por supuesto, pero creo que se ve bastante feo y es innecesariamente detallado).