在我的应用中,我希望像在管理面板中那样进行操作。我有一个包含其他数据和文件的表单,我想一次创建所有内容。如果由于尚未创建新条目而不知道RefID,该怎么办。我已经尝试了很多东西,但到目前为止没有任何效果。这是代码示例:
表格:
jobsForm = this.fb.group({
nom: [null],
date: [null],
address_chargement: [null],
address_dechargement: [null],
client: [null],
completed: [false],
status: ['waiting'],
comment_user: [null],
comment_admin: [null],
files: [null],
});
将表格分派到NGRX Store创建动作,该动作将调用我的服务,如下所示:
public createJob = (payload: IJob): Observable<IJob> => {
const data = new FormData();
Object.entries(payload).forEach(([key, value]) => {
data.append(key, value);
});
return this.http.post<IJob>(`${this.env.backendUrl}/jobs`, data);
}
我收到诸如以下错误:
[2019-06-16T20:10:03.573Z] error Error: SQLITE_ERROR: table jobs has no column named fields
或者它只是不上传。
答案 0 :(得分:2)
可以这样做。
默认情况下不是,您将必须在控制器/服务中进行一些更新。
内容管理器具有在同一请求中管理条目创建和文件上传的功能。因此,让我们在您的create动作中复制此逻辑。
注意:您必须发送带有FormData
的请求-以前不是这种请求。
首先,您必须创建一个名为addAndUpload
的新服务功能。
addAndUpload(ctx) {
// Get form data
const values = ctx.request.body;
// Silent recursive parser.
const parser = value => {
try {
value = JSON.parse(value);
} catch (e) {
// Silent.
}
return _.isArray(value) ? value.map(obj => parser(obj)) : value;
};
// Get files
const files = values.files;
// Get entry data
values = Object.keys(values.fields).reduce((acc, current) => {
acc[current] = parser(values.fields[current]);
return acc;
}, {});
// Create the entry without files
const entry = await strapi.api.job.services.add(values)
// Then, request plugin upload.
if (Object.keys(files).length > 0) {
// Upload new files and attach them to this entity.
// Here `job` have to be the model name
await strapi.plugins.upload.services.upload.uploadToEntity(
{
id: entry.id || entry._id,
model: 'job',
},
files
);
}
return strapi.api.job.services.job.findOne({
id: entry.id || entry._id,
});
}
在create
控制器函数中,您将必须调用strapi.api.job.services.addAndUpload(ctx)
而不是add
函数。
答案 1 :(得分:1)
我认为不可能那样做。我建议将创建Job
的过程分为两个步骤:
File
-> POST /upload
。Job
-> id
中使用FileResponse
创建POST /job
。 SQLITE_ERROR通知您Job
模型没有fields
,因为Job
模型接受refId
至File
。
您可以使用switchMap
合并两个Observable。