Node.js Cloudinary文件上载/ReactJs/Express节点无法获取响应

Node.js Cloudinary文件上载/ReactJs/Express节点无法获取响应,node.js,reactjs,express,file-upload,cloudinary,Node.js,Reactjs,Express,File Upload,Cloudinary,尝试在cloudinary上使用Express/Node进行文件上载工作时运气不佳。我能够发布请求,我的文件被上载到cloudinary服务器,但从未收到响应,导致我的请求超时。我使用[Express file upload][1]将数据作为比特流发送到cloudinary,并使用axios进行发布 我的快速路由器API代码: const fileUpload = require("express-fileupload"); const cloudinary = require("cloudin

尝试在cloudinary上使用Express/Node进行文件上载工作时运气不佳。我能够发布请求,我的文件被上载到cloudinary服务器,但从未收到响应,导致我的请求超时。我使用[Express file upload][1]将数据作为比特流发送到cloudinary,并使用axios进行发布

我的快速路由器API代码:

const fileUpload = require("express-fileupload");
const cloudinary = require("cloudinary");

    router.use(fileUpload());

    cloudinary.config({
        cloud_name: "xyx",
        api_key: "xyxxyxxyxxyxxyx",
        api_secret: "xyxxyxxyxxyxxyxxyx"
    });

    router.post("/upload", function(req, res, next) {
        console.log(req);
        var fileGettingUploaded = req.files.file.data;

        cloudinary.uploader
            .upload_stream({ resource_type: "raw" }, function(error, result) {
                console.log(error);
                console.log(result);
            })
            .end(fileGettingUploaded);
    });

  [1]: https://www.npmjs.com/package/express-fileupload
来自组件的My Axios Post请求

const { fileName } = this.state;
        const formData = new FormData();
        formData.append("file", fileName);
        const url = `/api/upload`;
        axiosInstance
            .post(url, formData, {
                headers: {
                    "Content-Type": fileName.type
                }
            })
            .then(response => {
                if (response.status === 200 && response.data) {
                    console.log(response);
                }
            })
            .catch(error => {
                console.log(error);
            });
    };

这导致一个请求成功地将我的文件上传到cloudinary(我可以在cloudinary的仪表板中看到上传的文件),但无法给我一个响应,理想情况下应该是上传文件的url。有人能告诉我我做错了什么吗?

这里有几件事需要纠正

A) 不需要创建这个

const formData = new FormData();
formData.append("file", fileName);
B) 在imgSrc状态下,您已经有了数据url。只需将其作为post参数发送到express服务器即可

大概是这样的:-

     uploadPicture = () => {
        const { fileName, imgSrc } = this.state;
        const url = `/api/upload`;
        axiosInstance
            .post(url, {
                fileUrl: imgSrc
            })
            .then(response => {
                if (response.status === 200 && response.data) {
                    console.log(response);
                }
            })
            .catch(error => {
                console.log(error);
            });
    };
c) 在节点服务器上,从req.body读取url

router.post("/upload", function(req, res, next) {
    const fileGettingUploaded = req.body.fileUrl;

    cloudinary.uploader.upload(fileGettingUploaded, function(result, error) {
        if (result) {
            res.status(200).json(result);
        } else {
            res.status(500).json(error);
        }
    });
});
这将为您解决问题

我不确定这是否是使用cloudinary进行图像上传的最佳方式,我建议您阅读更多关于它的内容,并了解其他人是如何做到这一点的


现在,这应该可以解决您的问题。

这里有两件事需要纠正

A) 不需要创建这个

const formData = new FormData();
formData.append("file", fileName);
B) 在imgSrc状态下,您已经有了数据url。只需将其作为post参数发送到express服务器即可

大概是这样的:-

     uploadPicture = () => {
        const { fileName, imgSrc } = this.state;
        const url = `/api/upload`;
        axiosInstance
            .post(url, {
                fileUrl: imgSrc
            })
            .then(response => {
                if (response.status === 200 && response.data) {
                    console.log(response);
                }
            })
            .catch(error => {
                console.log(error);
            });
    };
c) 在节点服务器上,从req.body读取url

router.post("/upload", function(req, res, next) {
    const fileGettingUploaded = req.body.fileUrl;

    cloudinary.uploader.upload(fileGettingUploaded, function(result, error) {
        if (result) {
            res.status(200).json(result);
        } else {
            res.status(500).json(error);
        }
    });
});
这将为您解决问题

我不确定这是否是使用cloudinary进行图像上传的最佳方式,我建议您阅读更多关于它的内容,并了解其他人是如何做到这一点的


目前,这应该可以解决您的问题。

您是否尝试只记录
响应,即不检查200以及是否有
数据
?控制台中是否有错误?@Tony是的,它不会记录任何响应。我看到的只是请求在我指定的时间后超时,即,错误:超过120000ms超时。您是否尝试只记录
响应
,即不检查200以及是否有
数据
?控制台中是否有任何错误?@Tony是的,它没有记录任何响应。我看到的只是请求在我指定的时间后超时,即,错误:超过120000毫秒的超时时间。工作正常!谢谢你的详细回答!imgSrc在该州会是什么样子?它是否等效于files.file.data,甚至是e.target.files[0]?使用新的FileReader();之后:reader.onload=e=>{this.setState({imgSrc:e.target.result});};reader.readAsDataURL(event.target.files[0]);很好用!谢谢你的详细回答!imgSrc在该州会是什么样子?它是否等效于files.file.data,甚至是e.target.files[0]?使用新的FileReader();之后:reader.onload=e=>{this.setState({imgSrc:e.target.result});};reader.readAsDataURL(event.target.files[0]);