如何解决使用graphql解析器从mongodb数据库中删除/替换文件的问题
我有一个模型,该模型从gridfs文件中获取一些数据:
const messageSchema = new Schema({
content: {
type: String
},path: {
type: String
},email: {
type: String
},fileImage:{
type: Boolean
},files_id: {
type: Schema.Types.ObjectId
}
});
然后我使用uploadMessage解析器将其上传:
uploadMessage: async (_,args) => {
const { fileImage,content,email } = args;
if(fileImage){
const { file } = args;
const newFile = await file.then(result => result);
const fileId = await storeFile(newFile,bucketName).then(result => result);
const { filename } = newFile;
const newMessage = new Message({
content: content,files_id: fileId,email: email,fileImage: fileImage,path: `/${bucketName}/${filename}`
});
return newMessage.save();
}
else {
// doesn't matter...
}
// Save the record and return it
}
bucketName只是我在使用解析器的文件开头定义的常量。 效果很好,我可以立即添加它而不会出错,但是删除和更新文件存在问题。
在解析器的开头,我初始化了流:
const mongoose = require('mongoose');
const Grid = require('gridfs-stream');
const conn = mongoose.connection;
Grid.mongo = mongoose.mongo;
// Init gfs
let gfs;
const bucketName = 'messages';
conn.once('open',() => {
// Init stream
gfs = Grid(conn.db);
gfs.collection(bucketName)
});
稍后我必须使用解析器,它们都具有相同的问题:
deleteMessage: (parent,args) => {
console.log(args);
// Create a new record in the database
if(!args)
throw new Error('Error');
if(args.fileImage){
return Message.findOneAndDelete({ _id: args._id },(err,user) => {
gfs.remove({ _id: user.files_id,root: bucketName },gridFSBucket) => {
if (err) {
throw new Error(err);
}
})
})
}
else return Message.findOneAndDelete({ _id: args._id })
}
update与delete类似,但是速度不快。 问题是,如果我单击删除文件的速度过快,则会收到错误消息: 在页面上:
Unhandled Rejection (Error): Network error: Unexpected token P in JSON at position 0
在终端上
TypeError: Cannot read property 'files_id' of null
它位于这里:
gfs.remove({ _id: user.files_id
这是我的钩子(由codegen生成):
const [deleteMessage] = useDeleteMessageMutation({ refetchQueries: refetchMessages,awaitRefetchQueries: true});
const [updateMessage] = useUpdateMessageMutation({ refetchQueries: refetchMessages,awaitRefetchQueries: true } );
DeleteClick功能:
const onDeleteClick = id => {
return e =>{
deleteMessage({ variables: { _id: id,fileImage: fileImage } });
}
};
DeleteClick函数(带有绑定):
const onDeleteClick = id => {
deleteMessage({ variables: { _id: id,fileImage: fileImage } });
};
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com(将#修改为@)