javascript - findReleaseById 与 Promise - NodeJS

标签 javascript mongoose promise

我有一个函数,可以通过 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]

上面的函数位于一个更大的函数内部。该函数计算两个版本之间的差异

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

最佳答案

在这一行:

.then(release?release.releasedate:undefined)

release未定义。您需要将其作为函数中的参数接收:

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

关于javascript - findReleaseById 与 Promise - NodeJS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50761911/

相关文章:

javascript - 如何打开新窗口并向其中写入数据

javascript - React On 循环打开模态

javascript - nodejs Q.all promise 函数调用自身

javascript - 这个 JavaScript 函数需要返回 Promise 吗?

javascript - 使用 queryselector 查找 ":"返回错误

javascript - 执行 `typeof JSON` 比较

node.js - 如何在 Mongoose 文档更新时触发函数

node.js - 如何将 websocket 放入数据库(mongoDB/mongoose)?

node.js - MongoDB - 使用 Mongoose 模式 - 如何告诉 Mongoose 不要保存特定字段

javascript - 阵列中的 Firebase Promises 未及时解决