htmlnode.jshttpapi-designshippo

Node shipping API using Shippo isn't working


I'm building an API and today I integrated my with a HTML form. However, it just says 'Cannot POST /newship'. What is wrong? My server.js:

var express = require('express')
var app = express()
var http = require('http');
//Shippo shipping wrapper
var Raven = require('raven');
var shippo = require('shippo')('shippo_test_key');
const bodyParser = require('body-parser');
app.use(bodyParser.urlencoded({extended: true}));
app.use(bodyParser.json());
//Test

app.get('/', function (req, res) {
  res.send('Hello World! ' + 'hey')
})
app.post('/newship/', function (req, res) {

  var addressFrom  = {
      "object_purpose":"PURCHASE",
      "name": Mr Shippotester,
      "company":"Shippo",
      "street1":"215 Clayton St.",
      "city":"San Francisco",
      "state":"CA",
      "zip":"94117",
      "country":"US", //iso2 country code
      "phone":"+1 555 341 9393",
      "email":"support@goshippo.com",
  };

  // example address_to object dict
  var addressTo = {
      "object_purpose":"PURCHASE",
      "name": req.body.fnames + ' ' + req.body.lnames,
      "company": req.body.company,
      "street1":req.body.street,
      "city":req.body.city,
      "state":req.body.state,
      "zip":req.body.zipcode,
      "country": req.body.country, //iso2 country code
      "phone":"+1 555 341 9393",
      "email":"support@goshippo.com",
  };

  // parcel object dict
  var parcelOne = {
      "length":"5",
      "width":"5",
      "height":"5",
      "distance_unit":"in",
      "weight":"2",
      "mass_unit":"lb"
  };


  var shipment = {
      "object_purpose": "PURCHASE",
      "address_from": addressFrom,
      "address_to": addressTo,
      "parcel": [parcelOne],
      "submission_type": "DROPOFF"
  };

  shippo.transaction.create({
      "shipment": shipment,
      "servicelevel_token": "dhl_express_domestic_express_doc",
      "carrier_account": "account_id",
      "label_file_type": "png"
  })
  .then(function(transaction) {
      shippo.transaction.list({
        "rate": transaction.rate
      })
      .then(function(mpsTransactions) {
          mpsTransactions.results.forEach(function(mpsTransaction){
              if(mpsTransaction.object_status == "SUCCESS") {
                  console.log("Label URL: %s", mpsTransaction.label_url);
                  console.log("Tracking Number: %s", mpsTransaction.tracking_number);
                  console.log("E-Mail: %s", mpsTransaction.object_owner);
                  console.log(mpsTransaction.object_status);
                  res.status(200).send("Label can be found under: " + mpsTransaction.label_url));
              } else {
                  // hanlde error transactions
                  console.log("Message: %s", mpsTransactions.messages);
              }
          });
      })
  }, function(err) {
      // Deal with an error
      console.log("There was an error creating transaction : %s", err.detail);
      res.send("something happened :O")
  });
})
app.post('/successp', function (req, res) {

  var token = req.body.stripeToken; // Using Express
  // Charge the user's card:
var charge = stripe.charges.create({
  amount: 1000,
  currency: "eur",
  description: "Example charge",
  source: token,
}, function(err, charge) {
  // asynchronously called
});
 res.send('Thanks!')
})
app.post('/successp', function (req, res) {

  var token = req.body.stripeToken; // Using Express
  // Charge the user's card:
var charge = stripe.charges.create({
  amount: 1000,
  currency: "eur",
  description: "Example charge",
  source: token,
}, function(err, charge) {
  // asynchronously called
});
 res.send('Thanks!')
})

app.listen(3000, function () {
  console.log('Example app listening on port 3000!')
})

My HTML-Form:

<!DOCTYPE html>
<html>
<head>
</head>




<form action="https://ocelot-kgxujaijbj.now.sh/newship/" method="post">
  Company (Leave blank if you don't belong to one): <input type="text" name="company"><br>
  First name: <input type="text" name="fnames"><br>
  Last name: <input type="text" name="lnames"><br>
  Street and Number: <input type="text" name="street"><br>
  City: <input type="text" name="city"><br>
  State: <input type="text" name="state"><br>
  ZIP/PLZ: <input type="text" name="zipcode"><br>
  Country (Please use the iso code, for example "US" for the USA or 'DE' for Germany): <input type="text" name="country"><br>
  <input type="submit" value="Submit">
</form>
</body>
</html>

The server is valid, so you try it out by yourself. Thanks in advance!


Solution

  • There are a few things wrong with the code that you have submitted there. Also, even though its a test token, I strongly encourage you to edit the code there to omit it from the post.

    I have made some edits to the code that you have provided, but you simply had some errors like on the addressFrom you were missing quotes around Mr. Shippotester. Also, you had an extra ) where you had res.status(200).send("Label can be found under: " + mpsTransaction.label_url);

    I strongly suggest reviewing your server.js for any errors (and I would be surprised its actually running).

    var express = require('express')
    var app = express()
    var http = require('http');
    //Shippo shipping wrapper
    var Raven = require('raven');
    var shippo = require('shippo')('<YOUR API TEST TOKEN>');
    const bodyParser = require('body-parser');
    const path = require('path');
    app.use(bodyParser.urlencoded({extended: true}));
    app.use(bodyParser.json());
    app.use(express.static(path.join(__dirname, '/')));
    //Test
    
    app.get('/', function (req, res) {
      res.render('index.html');
    })
    app.post('/newship/', function (req, res) {
    
      var addressFrom  = {
          "object_purpose":"PURCHASE",
          "name": "Mr Shippotester",
          "company":"Shippo",
          "street1":"215 Clayton St.",
          "city":"San Francisco",
          "state":"CA",
          "zip":"94117",
          "country":"US", //iso2 country code
          "phone":"+1 555 341 9393",
          "email":"support@goshippo.com",
      };
    
      // example address_to object dict
      var addressTo = {
          "object_purpose":"PURCHASE",
          "name": req.body.fnames + ' ' + req.body.lnames,
          "company": req.body.company,
          "street1":req.body.street,
          "city":req.body.city,
          "state":req.body.state,
          "zip":req.body.zipcode,
          "country": req.body.country, //iso2 country code
          "phone":"+1 555 341 9393",
          "email":"support@goshippo.com",
      };
    
      // parcel object dict
      var parcelOne = {
          "length":"5",
          "width":"5",
          "height":"5",
          "distance_unit":"in",
          "weight":"2",
          "mass_unit":"lb"
      };
    
    
      var shipment = {
          "object_purpose": "PURCHASE",
          "address_from": addressFrom,
          "address_to": addressTo,
          "parcel": [parcelOne],
          "submission_type": "DROPOFF"
      };
    
      shippo.transaction.create({
          "shipment": shipment,
          "servicelevel_token": "dhl_express_domestic_express_doc",
          "carrier_account": "9f123316d413417d9cc48627c402772c",
          "label_file_type": "png"
      })
      .then(function(transaction) {
          shippo.transaction.list({
            "rate": transaction.rate
          })
          .then(function(mpsTransactions) {
              mpsTransactions.results.forEach(function(mpsTransaction){
                  if(mpsTransaction.object_status == "SUCCESS") {
                      console.log("Label URL: %s", mpsTransaction.label_url);
                      console.log("Tracking Number: %s", mpsTransaction.tracking_number);
                      console.log("E-Mail: %s", mpsTransaction.object_owner);
                      console.log(mpsTransaction.object_status);
                      res.status(200).send("Label can be found under: " + mpsTransaction.label_url);
                  } else {
                      // hanlde error transactions
                      console.log("Message: %s", mpsTransactions.messages);
                  }
              });
          })
      }, function(err) {
          // Deal with an error
          console.log("There was an error creating transaction : %s", err.detail);
          res.send("something happened :O")
      });
    })
    app.post('/successp', function (req, res) {
    
      var token = req.body.stripeToken; // Using Express
      // Charge the user's card:
    var charge = stripe.charges.create({
      amount: 1000,
      currency: "eur",
      description: "Example charge",
      source: token,
    }, function(err, charge) {
      // asynchronously called
    });
     res.send('Thanks!')
    })
    app.post('/successp', function (req, res) {
    
      var token = req.body.stripeToken; // Using Express
      // Charge the user's card:
    var charge = stripe.charges.create({
      amount: 1000,
      currency: "eur",
      description: "Example charge",
      source: token,
    }, function(err, charge) {
      // asynchronously called
    });
     res.send('Thanks!')
    })
    
    app.listen(3000, function () {
      console.log('Example app listening on port 3000!')
    })
    <!DOCTYPE html>
    <html>
    <head>
    </head>
    
    
    
    
    <form action="http://localhost:3000/newship" method="post">
      Company (Leave blank if you don't belong to one): <input type="text" name="company"><br>
      First name: <input type="text" name="fnames"><br>
      Last name: <input type="text" name="lnames"><br>
      Street and Number: <input type="text" name="street"><br>
      City: <input type="text" name="city"><br>
      State: <input type="text" name="state"><br>
      ZIP/PLZ: <input type="text" name="zipcode"><br>
      Country (Please use the iso code, for example "US" for the USA or 'DE' for Germany): <input type="text" name="country"><br>
      <input type="submit" value="Submit">
    </form>
    </body>
    </html>