Search code examples
javascriptnode.jsexpressexpress-router

Express Routes not resolving to endpoints


I'm running this on Firebase Cloud Functions, soin my index.js,I have the following snippet of code:

const admin = require("firebase-admin");
const functions = require("firebase-functions");
const usersApi = require("./api/users")
const paymentsApi = require("./api/payments")
const express = require('express');
const cors = require('cors');

const app = express();

const checkHeader = async(req, res, next) => {
  if(req.headers.authorization) {
    admin.auth().verifyIdToken(req.headers.authorization)
    .then(token => {
      req.uid = token.uid;
      req.email = token.email;
      req.stripeID = token.stripeID || null;
      return next();
    })
    .catch(e => {
      return next(e.errorInfo.code)
    })
  } else {
      return next('No token found');
  }
}

app.use(cors({origin: true}));
app.use(express.urlencoded({extended: true}));
app.use(express.json());
//app.use(checkHeader);

app.disable("x-powered-by");

app.use("/users", usersApi)
app.use("/payments", paymentsApi)

exports.api = functions.https.onRequest(app)

and then in my usersApi route:

const express = require('express');
const userRouter = express.Router();
const fb = require('../../fb');
const db = fb.firestore()

userRouter.post('/addUser', (req, res) => {
    return db.collection('users').doc(req.uid).set({
      activeSub: false,
      name: req.body.name
    })
    .catch(err => {
      throw new functions.https.HttpsError('unknown', err.message, {success:false, error: {err}})
    })
})

userRouter.post("*", (req, res) => {
  res.status(404).send("This route does not exist in userRouter");
})

module.exports = userRouter;

No problems here. I can POST to domain.com/api/users/addUser and I can access that function.

My payments route though doesn't seem to resolve:

const express = require('express');
const paymentRouter = express.Router();
const functions = require("firebase-functions");
const fb = require('../../fb');
const db = fb.firestore()
const stripe = require('stripe')('.....');


paymentRouter.post('/createSubscription'), (req, res) => {
  return stripe.subscriptions.create({
    customer: req.body.userData.stripeID,
    items: [{plan: req.body.plan}]
  })
  .then((customer) => {
    console.log('then')
    console.log(customer)
    return db.collection('users').doc(req.uid)
    .update({
      stripeID: customer.id,
      activeSub: true
    })
  })
  .catch(e => {
    console.log(e)
    throw new functions.https.HttpsError('unknown', err.message, e);
  })
}

paymentRouter.post('/createUser'), (req, res) => {
  console.log('creating user')
  return stripe.customers.create({
    email: req.email,
    source: req.body.token
  })
  .then(customer => {
    console.log(customer)
    return db.collection('users').doc(req.uid)
    .update({
      stripeID: customer.id,
      activeSub: true
    })
  })
  .catch(e => {
    throw new functions.https.HttpsError('unknown', err.message, e);
  })
}

paymentRouter.post("*", (req, res) => {
  res.status(404).send("This route does not exist in paymentRouter");
})

module.exports = paymentRouter;

Whenever I send a POST request to domain.com/api/payments/createSubscription or /createUser, it always returns 404 with This route does not exist in paymentRouter"

Can anyone explain why?


Solution

  • Change paymentRouter.post('/createSubscription'), (req, res) => {

    to

    paymentRouter.post('/createSubscription', (req, res) => {
      return stripe.subscriptions.create({
        customer: req.body.userData.stripeID,
        items: [{plan: req.body.plan}]
      })
      .then((customer) => {
        console.log('then')
        console.log(customer)
        return db.collection('users').doc(req.uid)
        .update({
          stripeID: customer.id,
          activeSub: true
        })
      })
      .catch(e => {
        console.log(e)
        throw new functions.https.HttpsError('unknown', err.message, e);
      })
    }
    

    Change paymentRouter.post('/createUser'), (req, res) => {

    paymentRouter.post('/createUser', (req, res) => {
      console.log('creating user')
      return stripe.customers.create({
        email: req.email,
        source: req.body.token
      })
      .then(customer => {
        console.log(customer)
        return db.collection('users').doc(req.uid)
        .update({
          stripeID: customer.id,
          activeSub: true
        })
      })
      .catch(e => {
        throw new functions.https.HttpsError('unknown', err.message, e);
      })
    }