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

标签 javascript node.js express callback

我正在 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/

相关文章:

javascript - 如何在 Javascript 中访问 JSON 对象?

javascript - 如何从单页应用URL中解析参数?

node.js - "npm run build"= "react-scripts: Permission denied"

javascript - 在 react 中使用异步等待从火力存储中检索图像

javascript - 暂时禁用 "viewchangeend"事件

javascript - 在查询中附加单引号 (' ' )

javascript - 使用 Node.js FFI 绑定(bind)数据(javascript & c)

javascript - Node 和 Angular cookie 路径

node.js - 使用 Node-Cron 每 10 秒执行一次 Cron 作业

node.js - 计算 connect-redis 中的 session 数