gpt4 book ai didi

javascript - 在 Node.js 中传播错误回调并避免所有额外的麻烦?

转载 作者:太空宇宙 更新时间:2023-11-04 02:15:16 27 4
gpt4 key购买 nike

我正在 Node/Express 中编写 API。我需要一个端点,当您点击它时,它会对外部 API 执行三个 API 调用,然后将结果存储在 Mongo 中。基本上是数据库刷新。

我对 Node 、异步编程、回调等还不熟悉,所有这些都让我头晕目眩。这是我到目前为止所拥有的。我主要关心的是我如何处理错误。我看到它工作的唯一方法是执行如下所示的操作,将回调传递回我的每个函数,然后如果存在错误,则返回带有错误参数的回调,依此类推,直到它冒泡回顶部,快速服务器可以在其中创建适当的响应。这一切看起来真的很难看,而且非常随意,每个函数中都有额外的参数,而且流程没有多大意义,我觉得必须有更好的方法。

我知道有 promise ,并且我对 promise 解决方案持开放态度,特别是如果它是执行这些操作的标准方法,但我也想知道我应该在经典 javascript 中执行此操作的方式。

var app = require('express')();
var request = require('request');

app.put('/refresh', function(req, res) {
updateDatabase(function (error) {
if (error) {
res.sendStatus(500);
} else {
res.send(200);
}
});
});

function updateDatabase(callback) {
var handleErrors = function (error) {
if (error) {
return callback(error);
}
}
id1 = 'uniqueId1';
id2 = 'uniqueId2';
id3 = 'uniqueId3';
putLatestStuff(id1, handleErrors);
putLatestStuff(id2, handleErrors);
putLatestStuff(id3, handleErrors);
callback();
}

function putLatestStuff(id, callback) {
request('http://api.com/stuff/' + id, putIntoMongo(error, response, body, callback));
callback();

function putIntoMongo(error, response, body, callback) { // ??? all these parameters now required
// obviously not correct code
mongodriver.add(body, anotherFreakingCallback(callback));
}

function anotherFreakingCallback(error, result, callback) {
if (error) {
return callback(error);
}
callback();
}

这个设计太糟糕了,我确信我做错了。

最佳答案

根据每个人的建议, promise 最终成为解决此问题的方法。

var app = require('express')();
var fetch = require('isomorphic-fetch');

app.put('/refresh', function(req, res) {
var ids = ['uniqueId1', 'uniqueId2', 'uniqueId3'];
updateDatabase(ids)
.then(function (result) {
res.status(200).send(result);
})
.catch(function (error) {
res.status(500).send({error: error});
});
});

function updateDatabase(uniqueIds) {
var promises = [];
uniqueIds.forEach(function (id) {
promises.push(putLatestStuff(id));
});
return Promise.all(promises);
}

function putLatestStuff(id) {
return getLatestData(id)
.then(putIntoDatabase);
}

function getLatestData(id) {
return fetch('http://api.com/stuff/' + id);
}

function putIntoDatabase(data) {
return mongo.put(data); // mongo.put is fake function that returns a promise
}

关于javascript - 在 Node.js 中传播错误回调并避免所有额外的麻烦?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36050527/

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