为什么我收到 UnhandledPromiseRejectionWarning: TypeError: Cannot read property '_id' of undefined 错误?

问题描述 投票:0回答:1

我已经使用了 sslcommerz 支付网关,但是当我成功完成交易时,它没有在仪表板页面中重定向我,而是抛出了以下错误: UnhandledPromiseRejectionWarning:TypeError:无法读取未定义的属性“_id” 支付网关的代码是:

const express = require( 'express' );
const router = express.Router();
const SSLCommerzPayment = require( "sslcommerz" );
const User = require( '../models/user' );
const crypto = require( 'crypto' );


router.get( '/charge', isLoggedIn, ( req, res ) =>{
  User.findById( req.user._id, ( err, user ) => { res.render( 'payments/recharge', { user } ); } )
})

router.post( '/charge', isLoggedIn, async ( req, res ) =>
{

  const id = crypto.randomBytes( 16 ).toString( "hex" );
  const { amount } = req.body;
  console.log( id + " " + amount );
  const user = await User.findById( req.user._id )
  console.log( user.PhoneNumber );
  const data = {
    //transaction info
    total_amount: amount,
    currency: 'BDT',
    tran_id: id,
    cus_name: user.username,
    cus_email: user.email,
    cus_phone: user.PhoneNumber,

    //redirection urls
    success_url: `http://localhost:8000/payment/ssl-payment-success`,
    fail_url: `http://localhost:8000/payment/ssl-payment-fail`,
    cancel_url: `http://localhost:8000/payment/ssl-payment-cancel`,
    ipn_url: `http://localhost:8000/payment/ssl-payment-notification`,


    //will not be needed for our A2F but if we delete it sslcommerz will not work
    shipping_method: 'No',
    product_name: 'Computer.',
    product_category: 'Electronic',
    product_profile: 'general',
  };
  const sslcommerz = new SSLCommerzPayment( process.env.STORE_ID, process.env.STORE_PASSWORD, false ) //true for live default false for sandbox
  sslcommerz.init( data ).then( data =>
  {
    console.log( data.GatewayPageURL )
    if ( data.GatewayPageURL )
    {
      return res.status( 200 ).redirect( data.GatewayPageURL );
    }
    else
    {
      return res.status( 400 ).json( {
        message: "Session was not successful"
      } );
    }
  } );
} );

router.post("/ssl-payment-notification", async (req, res) => {

  return res.status(200).json(
    {
      data: req.body,
      message: 'Payment notification'
    }
  );
})

router.post("/ssl-payment-success", async (req, res) => {

  const user = await User.findById( req.user._id )
  user.wallet += Number(req.body.store_amount);
  user.save();
  return res.redirect( '/user/dashboard' );
})

router.post("/ssl-payment-fail", async (req, res) => {

  return res.status(200).json(
    {
      data: req.body,
      message: 'Payment failed'
    }
  );
})

router.post("/ssl-payment-cancel", async (req, res) => {

  return res.status(200).json(
    {
      data: req.body,
      message: 'Payment cancelled'
    }
  );
})

function isLoggedIn( req, res, next )
{
  // console.log(req.isAuthenticated());
  if ( req.isAuthenticated() )
  {
    return next();
  }
  res.redirect( '/user/login' );
}

module.exports = router;

app.js代码:

//App creation
const express = require("express");
const app = express();

//port setup
require('dotenv').config();
const port = process.env.PORT || 8080;

//body parser configutation
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));

//morgan configuration
const morgan = require('morgan');
app.use(morgan('dev'));

const cookieParser = require('cookie-parser')
app.use(cookieParser(process.env.SESSION_SECRET));
app.use(require('express-session')({
    secret: process.env.SESSION_SECRET,
    cookie : 
    {
        expires: false
    },
    resave: true,
    saveUninitialized: true
}));

//passport configuration
const passport = require('passport');
app.use(passport.initialize());
app.use(passport.session());

const localStrategy = require('passport-local');
const User = require('./models/user');
passport.use(new localStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());


//router configuration
const userRoutes = require('./routes/user');
app.use('/user',userRoutes);
const loanRoutes = require('./routes/loan');
app.use('/loan',loanRoutes);
const adminRoutes = require('./routes/admin');
app.use('/admin',adminRoutes);
const paymentRoutes = require('./routes/payment');
app.use('/payment',paymentRoutes);

//database connection
const mongoose = require('mongoose');
mongoose.connect("mongodb+srv://sifat:[email protected]/test", function(err) {
    if (err) {
        console.log("Database Not Connected", err);
    } else {
        console.log("Database Connected")
    }
});
mongoose.set('useFindAndModify', false);






//Other usage for application
app.use(express.static("public"));

app.use((req,res,next)=>{
    res.locals.currentUser = req.user;
    next();
});
app.set('view engine','ejs');

//Home page
app.get('/',(req,res)=>{res.render('home');})

//Server Start
app.listen(port, () => {console.log(`Server is running on port ${port}`);});

我认为问题出在我正在使用的快速会话中。我已经在我的代码中设置了 cookie 解析器,但它仍然抛出错误

javascript node.js express payment-gateway express-session
1个回答
0
投票

你必须更新

app.js
需要像:

const    express = require("express"),
          session = require('express-session'),
          env = require('dotenv'),
          bodyParser = require('body-parser'),
          morgan = require('morgan'),
          ...
          ...;
    const app = express();
    env.Config();
    // Express session
    app.use(
     session({
      secret: process.env.SESSION_SECRET,
      resave: true,
      saveUninitialized: true,
      cookie: { maxAge: 24 * 60 * 60 * 1000 },
  })
 )

希望这有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.