Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/39.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 承诺中的猫鼬改变发生得很晚_Javascript_Node.js_Mongodb_Promise - Fatal编程技术网

Javascript 承诺中的猫鼬改变发生得很晚

Javascript 承诺中的猫鼬改变发生得很晚,javascript,node.js,mongodb,promise,Javascript,Node.js,Mongodb,Promise,我正在用NodeJS编写一个API,其中我使用了Mongoose和BlueBird。关于promise chain,我的数据应该通过瀑布函数传递,但事实并非如此。让我的示例从getTagNames开始,获取一些JSON,将数据提供给retrieveTag进行查询,最后得到res.JSON() 这是我的玩具数据 function getTagNames(req, res) { var userId = req.params.uid; return new Promise.resolve

我正在用NodeJS编写一个API,其中我使用了Mongoose和BlueBird。关于promise chain,我的数据应该通过瀑布函数传递,但事实并非如此。让我的示例从
getTagNames
开始,获取一些
JSON
,将数据提供给
retrieveTag
进行查询,最后得到
res.JSON()

这是我的玩具数据

function getTagNames(req, res) {
  var userId = req.params.uid;
    return new Promise.resolve({
        'userId': userId,
        'variables': [
                { id: 1, name: 'hotel', type: 'String' },
                { id: 2, name: 'location', type: 'String' }
            ],
      })
}
我查询数据的方式。在mongo内部查询之后,我检查是否有一个具有
userID
的文档。如果不是,请插入并返回文档。注意
Tag
是我的mongo机型

function retrieveTag(data){
  Tag.findOne({'userId': data.userId})
    .exec()
    .then( function(tag){
      if (tag) {
        console.log('result', tag);
        // do something ...
        return tag;
      }
      else {
        var newTag = new Tag({
          advertiserId: advertiserId,
          variables: variables
        });
        newTag.save()
          .then(function () {
            console.log('newTag', newTag);
            return newTag;
          });
      }
    })
}
这是我的结果(
userId
1
),我的期望是
console.log('tags',data)毕竟发生,那么
数据
不应该是
未定义的

tags undefined
GET /api/tag/values/1 200 3ms
newTag { __v: 0,
  userId: '1',
  _id: 581b96090e5916cf3f5112fe,
  variables: 
   [ { type: 'String', name: 'hotel', id: 1 },
     { type: 'String', name: 'location', id: 2 } ] }

我的问题是我如何修复它。如果有一些不清楚的地方,请帮我更正。

解释有点不清楚,但是如果我正确地理解你,你会在承诺解决链中丢失数据

在阅读代码时,我注意到
retrieveTag
并没有返回猫鼬的承诺。要让
。然后在
getTagValues
中使用
retrieveTag
中找到的数据

因此,请改为:

function retrieveTag(data){
  return Tag.findOne({'userId': data.userId})
    .exec()
    .then( function(tag){
      ...
    })
}

解释有点不清楚,但如果我正确地跟随你,你会在承诺解决链中丢失数据

在阅读代码时,我注意到
retrieveTag
并没有返回猫鼬的承诺。要让
。然后在
getTagValues
中使用
retrieveTag
中找到的数据

因此,请改为:

function retrieveTag(data){
  return Tag.findOne({'userId': data.userId})
    .exec()
    .then( function(tag){
      ...
    })
}