繁体   English   中英

如何使用节点 js 通过 axios 将文件发送到外部 api

[英]How to send a file via axios to an external api using node js

我是 node js 的新手,我正在开发我的 nuxt 项目的服务器端。 实际上我想将文件发送到外部 api 但我收到错误Callback must be a function

在我的 server.js 中

let formidable = require('formidable');
const bodyParser = require('body-parser')
const app = require('express')()
const cookieParser = require('cookie-parser')
var fs = require('fs');
const cors = require('cors');

const fileUploadController = require("./controllers/fileUploadController");
app.use('/uploads', fileUploadController.uploadFile)

在我的fileUploadController.js

function uploadFile(req, res, next) {
   const axios = require('axios');
   const FormData = require('form-data');
   const fs = require('fs');

   const image =  fs.readFile('./down.png');

   const form = new FormData();
   form.append('productName', 'Node.js Stickers');
   form.append('productDescription', 'Cool collection of Node.js stickers for your laptop.');
    form.append('productImage', image, 'down.png');

   const response =  axios.post('http://api.com/api/nuxt', form, {
    headers: 
    {
     'Content-Type': 'multipart/form-data',
     }  
   });
 }

 module.exports = {uploadFile} 

fileUploadController.js ,您错误地使用了fs的 API。 fs.readFile接受 回调 不会返回您的文件。 您的代码应如下所示:

// fileUploadController.js
function uploadFile(req, res, next) {
  const axios = require('axios');
  const FormData = require('form-data');
  const fs = require('fs');

  fs.readFile('./down.png', async function(err, image) => {

    const form = new FormData();
    form.append('productName', 'Node.js Stickers');
    form.append('productDescription', 'Cool collection of Node.js stickers for your laptop.');
    form.append('productImage', image, 'down.png');

    const response = await axios.post('http://api.com/api/nuxt', form, {
      headers: {
        'Content-Type': 'multipart/form-data',
      }
    });
  });
}

module.exports = {
  uploadFile
};

这需要回调的原因是因为 JavaScript 是异步的,并且不会等待 fs 在继续之前完成读取文件,因此您必须在 function 完成后执行一些操作。

不过,我个人不会使用回调; 您可以使用fs.readFileSyncpromise 版本

除此之外,正如评论中所指出的,axios 返回一个 promise,所以你应该等待它(还要注意当前 function 声明之前的async )。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM