1
votes

I am creating an API, so I want to add a user system and validate access to the API.

This would be the middleware for validation:

'use strict'

const jwt = require('jwt-simple');
const moment = require('moment');
const config = require('../settings/config');

function isAuth(req, res, next) {
    if (!req.headers.authotization) {
        return res.status(403).send({
            message: `No tiene autorizacion`
        })
    }
    const token = req.headers.authotization.split(" ")[1];
    const payload = jwt.decode(token, user, config.token.secret_token);

    if (payload.exp <= moment().unix()) {
        return res.status(401).send({
            message: 'El token ha expirado'
        })

        req.user = payload.sub;
        next();

    }
}

module.exports = isAuth;

while this would be the route:

    'use strict'
    const express = require('express');
    const router = express.Router();
    const auth = require('../middlewares/auth');

    router.get('/', auth.isAuth, (req, res) => {
        res.status(200).send({
            message: `Tienes acceso`
        })
    })

on the other hand, this is my main application settings (app.js):

const express = require('express');
const bodyParser = require('body-parser');
const morgan = require('morgan');

const app = express();
const config = require('./config')

// Middleware
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(morgan('dev'));

// Routes variables
const productRouter = require('../routes/product');
const privateRouter = require('../routes/private');

// Routes uses
app.use('/api/product', productRouter);
app.use('/private', privateRouter);

app.listen(config.app.port, err => {
    if (err) throw err;
    console.log(`Server listening on port ${config.app.port}`)
})

module.exports = app;

I am getting this error:

D:\api-rest-carlos-azaustre\node_modules\express\lib\router\route.js:202 throw new Error(msg); ^

Error: Route.get() requires a callback function but got a [object Undefined] at Route. [as get] (D:\api-rest-carlos-azaustre\node_modules\express\lib\router\route.js:202:15) at Function.proto. [as get] (D:\api-rest-carlos-azaustre\node_modules\express\lib\router\index.js:510:19) at Object. (D:\api-rest-carlos-azaustre\routes\private.js:6:8) at Module._compile (internal/modules/cjs/loader.js:959:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) at Module.load (internal/modules/cjs/loader.js:815:32) at Function.Module._load (internal/modules/cjs/loader.js:727:14) at Module.require (internal/modules/cjs/loader.js:852:19) at require (internal/modules/cjs/helpers.js:74:18) at Object. (D:\api-rest-carlos-azaustre\settings\app.js:15:23) at Module._compile (internal/modules/cjs/loader.js:959:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) at Module.load (internal/modules/cjs/loader.js:815:32) at Function.Module._load (internal/modules/cjs/loader.js:727:14) at Module.require (internal/modules/cjs/loader.js:852:19) at require (internal/modules/cjs/helpers.js:74:18) [nodemon] app crashed - waiting for file changes before starting...

And sometimes this line is added at the top of error:

(node:3092) MaxListenersExceededWarning: Possible EventEmitter memory leak detected. 11 exit listeners > added to [Bus]. Use emitter.setMaxListeners() to increase limit

After reading the answers, I edit my question. I have placed only auth and not auth.isAuth and I am getting the following error:

D:\api-rest-carlos-azaustre\node_modules\express\lib\router\index.js:458 throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn)) ^

TypeError: Router.use() requires a middleware function but got a Object at Function.use (D:\api-rest-carlos-azaustre\node_modules\express\lib\router\index.js:458:13) at Function. (D:\api-rest-carlos-azaustre\node_modules\express\lib\application.js:220:21) at Array.forEach () at Function.use (D:\api-rest-carlos-azaustre\node_modules\express\lib\application.js:217:7) at Object. (D:\api-rest-carlos-azaustre\settings\app.js:20:5) at Module._compile (internal/modules/cjs/loader.js:959:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) at Module.load (internal/modules/cjs/loader.js:815:32) at Function.Module._load (internal/modules/cjs/loader.js:727:14) at Module.require (internal/modules/cjs/loader.js:852:19) at require (internal/modules/cjs/helpers.js:74:18) at Object. (D:\api-rest-carlos-azaustre\index.js:3:13) at Module._compile (internal/modules/cjs/loader.js:959:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:995:10) at Module.load (internal/modules/cjs/loader.js:815:32) at Function.Module._load (internal/modules/cjs/loader.js:727:14) [nodemon] app crashed - waiting for file changes before starting...

Does anybody know what is it due to?

2

2 Answers

1
votes

module.exports = isAuth; means you're only exporting the function and nothing else. That means when you do const auth = require('../middlewares/auth');, auth is the actual function, not an object containing isAuth as a property.

So, doing router.get('/', auth, (req, res) => { should work, instead of auth.isAuth which is invalid.

Learn more about modules here: https://js.evie.dev/modules

1
votes

Yes, you export the function with this code: module.exports = isAuth;

But then you call use it like this: auth.isAuth

Assuming you're doing something like const auth = require('./bin/auth.js'); or whatever

auth would be the function itself -- there will be no isAuth property.

So you should try this:

router.get('/', auth, (req, res) => {

You haven't posted your entire code, so this is just a best guess.