Search code examples
node.jsexpresspromisedatastore

req object with express causes UnhandledPromiseRejectionWarning


I have adapted the below code from Google's Datastore tutorial. I'm vaguely aware of Promises, and I'm using await where I can figure out to do so. I've used the req object with express as below without incident, but it seems to be empty here.

It causes this error:

2021-04-16 04:55:03 default[20210415t215354]  (node:10) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'name' of undefined

[SNIP]

name is a reference to a param I'm specifying like this:

curl -X POST https://MYURL/gizmos --data 'name=foo&type=bar&len=29'

What am I doing wrong? How do I avoid this?

 /**
  * @param {object} gizmo The gizmo record to insert.
  */
const insertGizmo = gizmo => {
  return datastore.save({
    key: datastore.key('gizmo'),
    data: gizmo,
  });
};

/**
 * Retrieve the latest gizmo
 */
const getLastGizmo = () => {
  const query = datastore
    .createQuery('gizmo')
    .order('createTime', {descending: true})
    .limit(1);

   return datastore.runQuery(query).then( (entities) => {
     return entities[0].map(fromDatastore);
   });

};

//Create a Gizmo
app.post('/gizmos', async (req, res, next) => {

   const createTime = new Date();

   const gizmo = {
      name: req.body.name,
      type: req.body.type,
      length: req.body.len,
      createTime: createTime,
    };

    try {
      await insertGizmo(gizmo);
  
      const newGizmo = await getLastGizmo();
      //const [newGizmos] = await getLastGizmo();
  
      await insertGizmo(gizmo);
  
      const newGizmo = await getLastGizmo();
      //const [newGizmos] = await getLastGizmo();
  
     const gizmoUrl = "https://MYURL/gizmos/"+newGizmo.id;
     const resText = {
      "id" : newGizmo.id,
      "name" : newGizmo.name,
      "type" : newGizmo.type,
      "length" : newGizmo.length,
      "self" : gizmoUrl,
    };
  
    res.status(201).set('Content-Type', 'text/plain').send(resText).end();
        
  } catch (error) {
    next(error);
  }
});

Solution

  • Per @hoangdv, add app.use(express.urlencoded()) somewhere. Rather node-ish not have it as the default if you ask me.