gpt4 book ai didi

javascript - 有更好的方法来编写这段代码吗? -- 在 NodeJS 中使用 Promises 链接 HTTP 请求 - 使用 Await/Async?

转载 作者:行者123 更新时间:2023-12-03 03:04:11 25 4
gpt4 key购买 nike

我正在使用 NodeJS 和 Express,通过查询数据库在网页上动态生成 HTTP。该页面将通过遍历 MongoDB 集合并使用数据库中的各种属性填充元素属性和内容来加载元素。 PUG/Jade 允许迭代返回的数据库 JSON 以生成元素

起初我只需要查询一个集合,但是当我需要查看两个或更多集合时遇到了麻烦。

我正在链接回调,但第一个查询的数据卡在第一个闭包中。我切换到了 Github 上方便的请求 promise 框架 ( https://github.com/request/request-promise )

我使用了 .then() 子句,但我仍然丢失返回值。我以为我可以运行 res.render 两次,但是如果第二个数据库查询仍未定义,它不允许我生成部分网页。

router.get('/main', authorize.adminRequired, function(req, res, next) {
rp.get({
url: 'http://localhost:3000/menus'
}, function(err, response, menuItems) {
console.log(menuItems);
res.render('index', {menu: menuItems}) //PUG error, PUG variable "history" is undefined
}).then(rp.get({
url: 'http://localhost:3000/transactions'
}, function(err, response, transactions, menuItems) { //menuItems is now Undefined
console.log(transactions);
return res.render('index', {menu: JSON.parse(menuItems), history: JSON.parse(menuItems)});
}));
});

我设法更改代码以使其正常工作。下面的代码看起来没问题。但是,是否有更好的方法可以使用等待将其写出并传递该值,而不是将这些函数链接为新变量?我还不太清楚如何很好地使用 Promise。

router.get('/main', authorize.adminRequired, function(req, res, next) {
var getMenuItems = rp.get({
url: 'http://localhost:3000/menus'
}, function(err, response, menuItems) {
console.log(menuItems);
return menuItems;
});

getMenuItems.then(function(result){
rp.get({
url: 'http://localhost:3000/transactions'
}, function(err, response, transactions) {
console.log(transactions);
return res.render('index', {menu: JSON.parse(result), history: JSON.parse(transactions)});
});
});
});

最佳答案

首先是这段代码

}).then(rp.get({

是错误的,因为 .then 接受 1 个(或两个)参数,但如果它们不是函数,则默默地忽略它们(即不会产生错误)

像您一样使用 .then,您将传递调用结果 rp.get - 这是一个 Promise,而不是函数

因此,正确使用请求 promise :

router.get('/main', authorize.adminRequired, function(req, res, next) {
rp.get({
url: 'http://localhost:3000/menus'
})
.then(menuItems => rp.get({ url: 'http://localhost:3000/transactions'}).then(transactions => ({transactions, menuItems})))
.then(({transactions, menuItems}) => {
// now do whatever with transactions and menuItems
})
});

使用异步/等待

router.get('/main', authorize.adminRequired, async function(req, res, next) {
let menuItems = await rp.get({url: 'http://localhost:3000/menus'});
let transactions = await rp.get({ url: 'http://localhost:3000/transactions'});
// now do whatever with transactions and menuItems
});

关于javascript - 有更好的方法来编写这段代码吗? -- 在 NodeJS 中使用 Promises 链接 HTTP 请求 - 使用 Await/Async?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47245647/

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