gpt4 book ai didi

javascript - NodeJS - 如何处理 UnhandledPromiseRejectionWarning?

转载 作者:行者123 更新时间:2023-12-02 21:45:54 24 4
gpt4 key购买 nike

我对 Node JS 还很陌生,所以我有点挣扎。

我正在尝试使用 Google Drive 的 API 从我的 Node Js 代码读取文件。

我有以下代码

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' });

});

当我发送 get 请求时,上面的代码给了我以下错误

(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-common\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.org/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.

问题出在以下行

  res.files.forEach(function (file) {

我已经尽了一切努力,但放弃了理解这个问题。

你能帮我解决这个问题吗?

谢谢!

最佳答案

this example in the doc ,您想要使用:

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

不是:

res.files.forEach(...)

而且,看起来一旦解决了这个问题,您就会遇到另一个问题,因为您在错误的位置调用了 res.render() 。而且,当您解决此问题后,您将遇到在 Google 回调中重新定义 res 的问题,这将隐藏 res.render 所需的更高级别的 res ().

我强烈建议您不要在此处使用async 库。这里似乎不需要它,而且它只会使事情变得复杂。而且,如果您确实需要协调异步操作的帮助,Promise 是实现这一目标的现代方法。

您没有显示您尝试对结果文件执行什么操作(除了记录它们),但这里有一个简单的实现可以做到这一点:

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);
});
});

请注意,我将 drive.files.list() 中的参数命名为 response 而不是 res,以便我可以访问来自 router.get() 回调的 res 和来自 drive.files.list() 回调的 response 。您为它们指定了相同的名称 res,这意味着您无法访问同名的 router.get() 参数。

关于javascript - NodeJS - 如何处理 UnhandledPromiseRejectionWarning?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60250759/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com