通过请求模块传输节点JS文件

时间:2017-01-23 18:58:37

标签: javascript node.js forms request

我正在创建一个节点服务器,文件可以上传到该节点服务器,然后发送到也使用节点的存储服务器。 为此,我使用Form-Data模块页面上描述的方法:

var formData = {
  my_field: 'my_value',
  my_file: fs.createReadStream(__dirname + '/unicycle.jpg'),
};

request.post({url:'http://service.com/upload', formData: formData}, function(err, httpResponse, body) {
  if (err) {
    return console.error('upload failed:', err);
  }
  console.log('Upload successful!  Server responded with:', body);
});

我的问题是,当我尝试在存储服务器上写入文件时,它会创建一个包含内容[object Object]的文本文件。

这是我的代码:

main.js

var form = new formData();
form = {
        'oldFileName': oldName,
        'newFileName': newName,
        'file': fs.createReadStream(FILEPATH),
    };

    request.post({url:'http://127.0.0.1:9001/upload', form: form}, function(err, httpResponse, body) {
        if (err) {
            return console.error('upload failed:', err);
        }
    });

storage.js

app.post('/upload', function(req,res){
    //Filenames are displayed without problem
    console.log(req.body.newFileName);
    console.log(req.body.oldFileName);

    fs.writeFile('./testing/' + req.body.newFileName, req.body.file, function(err) {
    if(err) {
        return console.log(err);
    }
})

我确信我错过了一些非常明显的东西,但我似乎无法让它发挥作用。

2 个答案:

答案 0 :(得分:0)

您正在formData form选项request中将application/x-www-form-urlencoded内容更改为multipart/form-data而不是var form = { 'oldFileName': oldName, 'newFileName': newName, 'file': fs.createReadStream(FILEPATH), }; request.post({url:'http://127.0.0.1:9001/upload', formData: form}, function(err, httpResponse, body) { if (err) { return console.error('upload failed:', err); } });

<强> app.js

multipart/form-data

另外,要解析multer,您必须使用body-parser或类似的库,storage.js在这种情况下不起作用。请查找以下用于保存文件的 var multer = require('multer') var upload = multer({ storage: multer.diskStorage({ destination: function (req, file, cb) { cb(null, './testing/'); }, filename: function (req, file, cb) { cb(null, req.body.newFileName); } }) }).single('file'); app.post('/upload', function(req, res, next){ upload(req, res, function (err) { if(err){ return res.send(err); } else{ return res.send("Upload successfully"); } }); }); 代码。

storage.js

max_threads

希望它对你有所帮助。

答案 1 :(得分:0)

或者,将[object Object]包装在JSON.stringify()方法中,应该可以显示对象的文字字符串内容。

在我的情况下,我使用OJS2.0协议使用NodeJS库上传YouTube视频。

在此标准内,您发布您的客户端ID和客户端密钥以验证您对YouTube数据API的使用。

作为回报,服务器以访问令牌和刷新令牌的形式返回令牌。这些令牌需要刷新使用API​​的能力,而不会过期。

但是,当我请求“令牌”时,我正在终端中接收(对象,对象)。...

Logger.log(Got the tokens:(token));

为纠正此问题并以可读的字符串格式在终端中显示令牌,我执行了以下操作...

Logger.log(Got the tokens: ${JSON.stringify(token)});

现在我可以相应地使用令牌了。

//注意-ES6反引号用作字符串文字,但反引号似乎未显示在参数中。