javascript - NodeJS - How to deal with UnhandledPromiseRejectionWarning? - Stack Overflow

I am fairly new to Node JS and so I am struggling a bit.I am trying to read files for google drive usin

I am fairly new to Node JS and so I am struggling a bit.

I am trying to read files for google drive using their API, from my Node Js code.

I am having the following code

router.get('/', function (req, res, next) {

  var pageToken = null;
// Using the NPM module 'async'
async.doWhilst(function (callback) {
  drive.files.list({
    q: "mimeType='image/jpeg'",
    fields: 'nextPageToken, files(id, name)',
    spaces: 'drive',
    pageToken: pageToken
  }, function (err, res) {
    if (err) {
      // Handle error
      console.error(err);
      callback(err)
    } else {
      res.files.forEach(function (file) {
        console.log('Found file: ', file.name, file.id);
      });
      pageToken = res.nextPageToken;
      callback();
    }
  });
}, function () {
  return !!pageToken;
}, function (err) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    // All pages fetched
  }
})

  res.render('index', { title: 'Express' });

});

The above code is giving me the following error when i send the get request

(node:13884) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined
    at E:\nodejs\newcelebapi\routes\index.js:49:17
    at E:\nodejs\newcelebapi\node_modules\googleapis-mon\build\src\apirequest.js:43:53
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:13884) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see .html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:13884) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

The issue is in the following line

  res.files.forEach(function (file) {

I've tried everything I could and gave up understanding the problem.

Could you please help me with this?

Thanks!

I am fairly new to Node JS and so I am struggling a bit.

I am trying to read files for google drive using their API, from my Node Js code.

I am having the following code

router.get('/', function (req, res, next) {

  var pageToken = null;
// Using the NPM module 'async'
async.doWhilst(function (callback) {
  drive.files.list({
    q: "mimeType='image/jpeg'",
    fields: 'nextPageToken, files(id, name)',
    spaces: 'drive',
    pageToken: pageToken
  }, function (err, res) {
    if (err) {
      // Handle error
      console.error(err);
      callback(err)
    } else {
      res.files.forEach(function (file) {
        console.log('Found file: ', file.name, file.id);
      });
      pageToken = res.nextPageToken;
      callback();
    }
  });
}, function () {
  return !!pageToken;
}, function (err) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    // All pages fetched
  }
})

  res.render('index', { title: 'Express' });

});

The above code is giving me the following error when i send the get request

(node:13884) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'forEach' of undefined
    at E:\nodejs\newcelebapi\routes\index.js:49:17
    at E:\nodejs\newcelebapi\node_modules\googleapis-mon\build\src\apirequest.js:43:53
    at processTicksAndRejections (internal/process/task_queues.js:97:5)
(node:13884) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). To terminate the node process on unhandled promise rejection, use the CLI flag `--unhandled-rejections=strict` (see https://nodejs/api/cli.html#cli_unhandled_rejections_mode). (rejection id: 1)
(node:13884) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

The issue is in the following line

  res.files.forEach(function (file) {

I've tried everything I could and gave up understanding the problem.

Could you please help me with this?

Thanks!

Share Improve this question asked Feb 16, 2020 at 16:43 Thikka ReyaThikka Reya 231 gold badge1 silver badge4 bronze badges 1
  • 1 JS moved on since that async package was written, and it has had support for promises and native async/await for quite a while now - I would strongly remend not using that package unless you know JS well enough to be able to explain why native async/await or promises aren't good enough (which it feels is safe to say is not the case right now). – Mike 'Pomax' Kamermans Commented Feb 16, 2020 at 17:15
Add a ment  | 

1 Answer 1

Reset to default 3

Per this example in the doc, you want to be using:

res.data.files.forEach(...)

not:

res.files.forEach(...)

And, it looks like as soon as you get by that problem, you will have another problem because you are calling res.render() in the wrong place. And, when you fix that, you will have an issue with redefining res in your Google callback which will hide the higher level res that you need for res.render().

I would strongly remend that you not use the async library here. It doesn't seem like it's needed here and it just plicates things. And, if you did need help doing coordination of asynchronous operations, promises is the modern way to do so.

You don't show what you're trying to do with the resulting files (other than logging them), but here's a simple implementation that does that:

router.get('/', function (req, res, next) {
  var pageToken = null;
  drive.files.list({
    q: "mimeType='image/jpeg'",
    fields: 'nextPageToken, files(id, name)',
    spaces: 'drive',
    pageToken: pageToken
  }).then(response => {
      let files = response.data.files;
      files.forEach(file => console.log('Found file: ', file.name, file.id))
      res.render('index', { title: 'Express' });
  }).catch(err => {
      console.log(err);
      res.sendStatus(500);
  });
});

Note, that I named the parameter from drive.files.list() to be named response instead of res so I can access both res from the router.get() callback and response from the drive.files.list() callback. You gave them both the same name res which means you can't access the router.get() parameter of the same name.

发布者:admin,转转请注明出处:http://www.yc00.com/questions/1744202861a4562964.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信