Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/36.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
Node.js 与SailsJS的多态关联_Node.js_Sails.js - Fatal编程技术网

Node.js 与SailsJS的多态关联

Node.js 与SailsJS的多态关联,node.js,sails.js,Node.js,Sails.js,我使用sailsJS构建了一个restapi,它利用了蓝图 我的设计有很多资源,其中一个是资产资源: Asset ( id, type, owner_type, owner_id, url); 这将作为入口点,为系统中的任何其他资源托管多个资产 即 用户资源可以有多个图像和一个视频。所有这些记录都存储在资产资源下 Asset ( id, type, owner_type, owner_id, url); Asset ( 1, 'image', 'User', 1, 'http://path.t

我使用sailsJS构建了一个restapi,它利用了蓝图

我的设计有很多资源,其中一个是资产资源:

Asset ( id, type, owner_type, owner_id, url);
这将作为入口点,为系统中的任何其他资源托管多个资产

用户资源可以有多个图像和一个视频。所有这些记录都存储在资产资源下

Asset ( id, type, owner_type, owner_id, url);
Asset ( 1, 'image', 'User', 1, 'http://path.to.image.com/abc.jpg');
Asset ( 2, 'video', 'User', 1, 'https://youtube.com/sdasd');
Asset ( 3, 'image', 'BlogPost', 20, 'http://path.to.image.com/blogpost.jpg');
因此,理想情况下,当我通过ID获取用户或获取所有用户时,我更希望获取该对象的相关资产


如果我实现了GetOne和GetAll这两种方法,那么可以准备响应,但是当使用蓝图时,它有点模糊

如果我理解正确,您有用户模型,然后您有资产模型

用户模型看起来像

//User.js
module.exports={
    assets:{collection:'Asset',via:'owner_id'}
}
module.exports={
    type:'string',
    owner_type:'string',
    owner_id:{model:'User'},
    url:'string'
}
资产模型应该如下所示

//User.js
module.exports={
    assets:{collection:'Asset',via:'owner_id'}
}
module.exports={
    type:'string',
    owner_type:'string',
    owner_id:{model:'User'},
    url:'string'
}
您将无法直接使用蓝图,但可以执行以下操作:

//UserController.js
module.exports={
    findOne:function(req,res){
        User.findOne(req.param.id).populate('assets',{owner_type:'User'}).exec(function(data){res.json(data)});
    },
    find:function(req,res){
       User.find().populate.....//same idea
   }

}
这个填充参数{owner_type}是填充选项,因此它只填充资产集合,其中owner_type是“User”,您也可以指定限制,就像文档一样,不幸的是我没有找到这方面的正式文档,sails和waterline仍然是一个年轻的框架,很多不清楚的文档和东西,但我认为你使用它的选择是正确的。如果有帮助,请告诉我

编辑:这只适用于用户,如果您有一个博客模型也需要填充它,那么您可以手动完成

//Blog.js
var Promise=require('bluebird');
module.exports={
    findOne:function(req,res){
        Promise.all([Blog.findOne(req.param.id),
        Asset.find({owner_id:req.param.id,owner_type:'blog'})])
        .spread(function(blog,assets){
            blog.assets=assets
            return req.json(blog);
        })
    }
}

如果我理解你是正确的,你有一个用户模型,然后你有一个资产模型

用户模型看起来像

//User.js
module.exports={
    assets:{collection:'Asset',via:'owner_id'}
}
module.exports={
    type:'string',
    owner_type:'string',
    owner_id:{model:'User'},
    url:'string'
}
资产模型应该如下所示

//User.js
module.exports={
    assets:{collection:'Asset',via:'owner_id'}
}
module.exports={
    type:'string',
    owner_type:'string',
    owner_id:{model:'User'},
    url:'string'
}
您将无法直接使用蓝图,但可以执行以下操作:

//UserController.js
module.exports={
    findOne:function(req,res){
        User.findOne(req.param.id).populate('assets',{owner_type:'User'}).exec(function(data){res.json(data)});
    },
    find:function(req,res){
       User.find().populate.....//same idea
   }

}
这个填充参数{owner_type}是填充选项,因此它只填充资产集合,其中owner_type是“User”,您也可以指定限制,就像文档一样,不幸的是我没有找到这方面的正式文档,sails和waterline仍然是一个年轻的框架,很多不清楚的文档和东西,但我认为你使用它的选择是正确的。如果有帮助,请告诉我

编辑:这只适用于用户,如果您有一个博客模型也需要填充它,那么您可以手动完成

//Blog.js
var Promise=require('bluebird');
module.exports={
    findOne:function(req,res){
        Promise.all([Blog.findOne(req.param.id),
        Asset.find({owner_id:req.param.id,owner_type:'blog'})])
        .spread(function(blog,assets){
            blog.assets=assets
            return req.json(blog);
        })
    }
}

试试我的多态性、深度和包容性populat钩子:它解决多态性关联等问题

特征:
  • 多态群体
    • 例如:
      js let Results=wait Status.find().populate('*')
  • 深层种群
    • 例如:
      js let Results=await Person.find().populate('home.acculations.status.*)
  • 包容性标准人群
    • 例如:
      js let Results=await Person.find().populate('home.accumbers&state.status&phones.*&network')
  • 深度野生对象和数组Utils
    • 例如:
      js sails.hooks.deeporm.wild.get(记录,“*.home.accounters.*.phones.0.number”)

试试我的多态性、深度和包容性的populat钩子:它解决多态性关联等问题

特征:
  • 多态群体
    • 例如:
      js let Results=wait Status.find().populate('*')
  • 深层种群
    • 例如:
      js let Results=await Person.find().populate('home.acculations.status.*)
  • 包容性标准人群
    • 例如:
      js let Results=await Person.find().populate('home.accumbers&state.status&phones.*&network')
  • 深度野生对象和数组Utils
    • 例如:
      js sails.hooks.deeporm.wild.get(记录,“*.home.accounters.*.phones.0.number”)

这里还有一些官方文档可能会有所帮助:@www.owner\u id并不总是用户,它会改变。因此,基本上在1个用例中,它可以是属于用户的资产,对于另一个用例,它可以是属于博客文章的资产。所有者类型将存储模型类型(用户,BlogPost)@GayanL是的,恐怕您只能选择一个来填充集合。我的示例只允许您获取用户的资产,但您无法执行Blogpost.populate。很抱歉让您失望,但您当然可以通过两步流程手动完成。如果您需要更多,请告诉我help@Evilsanta伟大的因为每次我需要时都没有本机实现覆盖,所以需要多态实现。@GayanL实际上根据我自己的经验,我不喜欢将本机蓝图用于博客或用户等主要模型。因为当u填充m到m或1到m时,填充速度明显较慢。我只是关闭了默认填充,并且通常为find方法编写代码。实现你自己也不需要太多。这里还有一些官方文档可能会有所帮助:@Evilsanta那么,所有者id并不总是一个用户,它会改变。因此,基本上在1个用例中,它可以是属于用户的资产,对于另一个用例,它可以是属于博客文章的资产。所有者类型将存储模型类型(用户,BlogPost)@GayanL是的,恐怕您只能选择一个来填充集合。我的示例只允许您获取用户的资产,但您无法执行Blogpost.populate。很抱歉让您失望,但您当然可以通过两步流程手动完成。如果您需要更多,请告诉我help@Evilsanta伟大的因为每次我需要时都没有本机实现覆盖,所以需要多态实现。@GayanL实际上根据我自己的经验,我不喜欢将本机蓝图用于博客或用户等主要模型。因为当u填充m到m或1到m时,填充速度明显较慢。我只是关闭了默认填充,并且通常为find方法编写代码。实现你自己也不需要太多