gpt4 book ai didi

javascript - 如何在插入时引用另一个集合?

转载 作者:可可西里 更新时间:2023-11-01 01:54:38 25 4
gpt4 key购买 nike

我想弄清楚如何获取图像(使用 CollectionFS 的文件)并将图像的 ID 插入到我的项目 imageId 字段中:

lib/collections/items.js

Items = new Mongo.Collection("items");
Items.attachSchema(new SimpleSchema({
name: {
type: String,
label: "Name",
},
userId: {
type: String,
regEx: SimpleSchema.RegEx.Id,
autoform: {
type: "hidden",
label: false
},
autoValue: function () { return Meteor.userId() },
},
image: {
type: String,
optional: true,
autoform: {
label: false,
afFieldInput: {
type: "fileUpload",
collection: "Images",
label: 'Select Photo',
}
}
},
imageId: {
type: String
}
}));

lib/collections/images.js

if (Meteor.isServer) {
var imageStore = new FS.Store.S3("images", {
accessKeyId: Meteor.settings.AWSAccessKeyId,
secretAccessKey: Meteor.settings.AWSSecretAccessKey,
bucket: Meteor.settings.AWSBucket,
});

Images = new FS.Collection("Images", {
stores: [imageStore],
filter: {
allow: {
contentTypes: ['image/*']
}
}
});
}

// On the client just create a generic FS Store as don't have
// access (or want access) to S3 settings on client
if (Meteor.isClient) {
var imageStore = new FS.Store.S3("images");
Images = new FS.Collection("Images", {
stores: [imageStore],
filter: {
allow: {
contentTypes: ['image/*']
},
}
});
}

现在我的允许规则是:

server/allows.js

Items.allow({
insert: function(userId, doc){return doc && doc.userId === userId;},
update: function(userId, doc){ return doc && doc.userId === userId;},
remove: function(userId, doc) { return doc && doc.userId === userId;},
})

Images.allow({
insert: function(userId, doc) { return true; },
update: function(userId,doc) { return true; },
remove: function(userId,doc) { return true; },
download: function(userId, doc) {return true;},
});

我正在使用 Autoform,所以我的表单如下所示:

client/item_form.html

<template name="insertItemForm">
{{#autoForm collection="Items" id="insertItemForm" type="insert"}}
{{> afQuickField name="name" autocomplete="off"}}
{{> afQuickField name="image" id="imageFile"}}
<button type="submit">Continue</button>
{{/autoForm}}
</template>

现在,当我选择浏览并选择一个图像时,它将在数据库中,我想获取它拥有的 _id 并将其放置在 Item 中之后创建,但如何获取该特定图像?我认为这是引用图像的好方法。

UPDATE 1

选择文件后发现ID其实是隐藏的:

<input type="hidden" class="js-value" data-schema-key="image" value="ma633fFpKHYewCRm8">

所以我试图将 ma633fFpKHYewCRm8 作为 String 放置在 ImageId 中。

UPDATE 2

也许一种方法是使用 FS.File Reference

最佳答案

我已经更简单地解决了同样的问题,插入文件后,我只是调用一个方法来更新相关的集合:

客户端.html

<template name="hello">
<p>upload file for first texture: <input id="myFileInput1" type="file"> </p>
</template>

lib.js

var textureStore = new FS.Store.GridFS("textures");

TextureFiles = new FS.Collection("textures", {
stores: [textureStore]
});

Textures = new Mongo.Collection("textures");

客户端.js

Template.hello.events({
'change #myFileInput1': function(event, template) {
uploadTextureToDb('first',event);
}
});

function uploadTextureToDb(name, event) {
FS.Utility.eachFile(event, function(file) {
TextureFiles.insert(file, function (err, fileObj) {
// Inserted new doc with ID fileObj._id, and kicked off the data upload using HTTP
console.log('inserted');
console.log(fileObj);
//after file itself is inserted, we also update Texture object with reference to this file
Meteor.call('updateTexture',name,fileObj._id);
});
});
}

服务器.js

  Meteor.methods({
updateTexture: function(textureName, fileId) {
Textures.upsert(
{
name:textureName
},
{
$set: {
file: fileId,
updatedAt: Date.now()
}
});
}
});

因为你正在使用 autoForm 和 simpleSchema,这可能不是那么容易,但我建议你首先忘记 autoForm 和 simpleSchema,并尝试让它与简单的 html 和默认集合一起工作。

一切正常后,您可以返回设置它们,但请注意,涉及到 CollectionFS 时可能会出现更多问题,尤其是涉及到 autoForm 生成的样式时。

关于javascript - 如何在插入时引用另一个集合?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34983720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com