【问题标题】:findReleaseById with promise - NodeJS带有承诺的 findReleaseById - NodeJS
【发布时间】:2018-11-18 14:09:14
【问题描述】:

我有一个函数,它通过 id 找到一个 Release,它返回一个 Promise。 但是在第二个 then 版本中没有定义。我不明白为什么。 有人可以解释并建议代码编辑。我真的被困在这上面了。

我的代码

var findReleaseById = function(id) {
  return Release.find({ _id: id }).select('releasedate').exec()
    .then(releaseArray => Array.isArray(releaseArray) ? releaseArray[0] : undefined)
    .then(release ? release.releasedate : undefined)
}

给我

ReferenceError: release is not defined

[编辑 1]

上面的函数在一个更大的函数中。此函数计算 2 个版本之间的差异

exports.release_difference = (req, resp, next) => {
  const relid1 = req.query.rel1;
  const relid2 = req.query.rel2;

  var findFeatures = function(releases) {
    const promises = releases.map(release =>
      Feature.find({
        'release._id': release._id
      }).select('name description release').exec()
    )

    return Promise.all(promises)
      .then(featureArrayArray => featureArrayArray.filter(featureArray => Array.isArray(featureArray)))
      .then(featureArrayArray => [].concat(featureArrayArray))
      .catch(error => {});

  }

  var findChanges = function(releases) {
    const promises = releases.map(release =>
      Change.find({
        'release._id': release._id
      }).select('name description relatedFeature release').exec()
    )

    return Promise.all(promises)
      .then(changeArrayArray => changeArrayArray.fill(changeArray => Array.isArray(changeArray)))
      .then(changeArrayArray => [].concat(changeArrayArray))
      .catch(error => {});
  }

  var makepdf = function(features, changes, releasess, template, options, cb) {
    pdfcreator.makepdf(features, changes, releasess, template, options, function(res) {
      cb(res.filename);
    });
  }

  var findReleaseById = function(id) {
    return Release.find({
        _id: id
      }).select('releasedate').exec()
      .then(releaseArray => Array.isArray(releaseArray) ? releaseArray[0] : undefined)
      .then(release => release ? release.releasedate : undefined)
  }

  const releasedate1Promise = findReleaseById(relid1);
  const releasedate2Promise = findReleaseById(relid2);

  Promise.all(releasedate1Promise, releasedate2Promise)
    .then(([releasedate1, releasedate2]) => {
      return Release.find({
        'releasedate': {
          '$gt': releasedate1,
          '$lte': releasedate2
        }
      }).sort('version').exec()
    })
    .then(releasesBetween => {
      const fsPromise = findFeatures(releasesBetween);
      const csPromise = findChanges(releasesBetween);

      return Promise.all(fsPromise, csPromise)
    })
    .then(([fs, cs]) => {
      makepdf(fs, cs, releasesBetween, template, options, function(file) {
        resp.download(file);
      });
    });
}

【问题讨论】:

  • 尝试添加一个catch 块,因为一个或多个请求会引发错误。另外,使用 mongoose lean 函数 (.lean().exec()),所以响应是一个普通的 javascript 对象,而不是一个 mongoose 文档。
  • TypeError: (var)[Symbol.iterator] is not a function at Function.all (native) at exports.release_difference (/home/larssuffys/bigdisk/git-repositories/retrakt.git/node -server/controllers/releases.js:175:9)releases.js 第 175 行是 Promise.all(releasedate1Promise,releasedate2Promise).then(...)
  • 我认为 Promise.all 应该有一个数组(或其他迭代器)作为参数。改用Promise.all([releasedate1Promise,releasedate2Promise])
  • @NicoVanBelle 是的,它确实需要一个数组。与此同时,我自己也发现了这个错误。现在我明白了:{ CastError: Cast to date failed for value "[ 2018-06-08T00:00:00.000Z, 2018-06-10T00:00:00.000Z ]" at path "releasedate" for model "Release"

标签: javascript mongoose promise


【解决方案1】:

在这一行:

.then(release?release.releasedate:undefined)

releaseundefined。您需要在函数中将其作为参数接收:

.then(release => release ? release.releasedate : undefined)

【讨论】:

  • 感谢您的快速回复。但现在我得到 (node:5108) UnhandledPromiseRejectionWarning: Unhandled Promise Rejection (rejection id: 2): TypeError: (var)[Symbol.iterator] is not a function
  • const relid1 = req.query.rel1; const releaseate1Promise = findReleaseById(relid1);
猜你喜欢
  • 2020-04-24
  • 2018-01-31
  • 2020-03-12
  • 1970-01-01
  • 2019-09-29
  • 2019-03-19
  • 1970-01-01
  • 2020-08-19
  • 1970-01-01
相关资源
最近更新 更多