javascript - NodeJS : cannot grab post request text field

标签 javascript node.js ajax formidable

我是 Node JS 新手,所以事情对我来说并不容易。场景是我有一个可以接受多个文件的输入字段。

<input id="upload-input" type="file" name="uploads[]" multiple="multiple">

在我的 JS 脚本中,我捕获该字段的更改事件,并使用 formDataajax 创建对在不同端口中运行的 uploader 应用程序的发布请求帖子方法

$('#upload-input').on('change', function() {
var files = $(this).get(0).files;
if (files.length > 0) {
    var formData = new FormData();
    formData.append('directory', "path/to/directory");
    for (var i = 0; i < files.length; i++) {
        var file = files[i];
        formData.append('uploads[]', file, file.name);
    }
    $.ajax({
        url: 'https://myurl.com:3000/upload',
        type: 'POST',
        data: formData,
        processData: false,
        contentType: false,
        success: function(data) {
            console.log(data);
        },
    });
}
});

现在文件正在发送,在我的后端我可以使用formidable上传该文件,但问题是我无法获取directory值,这是我的代码

require('dotenv').load();
var express = require('express');
var app = express();
var path = require('path');
var formidable = require('formidable');
var fs = require('fs');
var session = require('express-session');
app.set('views', __dirname + '/public');
app.use('/uploads', express.static(process.env.USER_UPLOADS))
var cors=require('cors');
app.use(cors({origin:true,credentials: true}));
app.post('/upload', function(req, res) {
    var user_folder = "path/to/directory/";
    var form = new formidable.IncomingForm();
    form.multiples = true;
    form.uploadDir = path.join(__dirname, process.env.USER_UPLOADS + user_folder);
    form.on('file', function(field, file) { fs.rename(file.path, path.join(form.uploadDir, file.name)); });
    form.on('error', function(err) { console.log('An error has occured: \n' + err); });
    form.on('end', function() { res.end('success'); });
    form.parse(req);
});
var server = app.listen(3000, function(){
    console.log('Server listening on port 3000');
});

我试过了

console.log(req.body)

但它返回undefined,那么我如何从后端获取directory值?

提前致谢。

最佳答案

为了解决您的问题,我对您的主应用程序的服务器文件进行了一些更改 即 server.js/app.js/index.js 适用于您的任何人。请参阅以下更改:

require('dotenv').load();
var express = require('express');
var app = express();
var path = require('path');
var bodyParser = require('body-parser');
var formidable = require('formidable');
var fs = require('fs');
var session = require('express-session');
var cors=require('cors');

app.set('views', __dirname + '/public');

app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));
app.use(cors({ origin:true, credentials: true }));
app.use('/uploads', express.static(process.env.USER_UPLOADS));


app.post('/upload', function(req, res) {
    var user_folder = "path/to/directory/";
    var form = new formidable.IncomingForm();
    form.multiples = true;
    form.uploadDir = path.join(__dirname, process.env.USER_UPLOADS + user_folder);
    form.on('file', function(field, file) { fs.rename(file.path, path.join(form.uploadDir, file.name)); });
    form.on('error', function(err) { console.log('An error has occured: \n' + err); });
    form.on('end', function() { res.end('success'); });

    // Note the changes here
    form.parse(req, (error, fields, files) => {
      console.log(JSON.stringify({
        fields, // { directory: "path/to/directory" }
        files // contains the uploaded files
    }), null, 2);
  });
});


var server = app.listen(3000, function(){
    console.log('Server listening on port 3000');
});

根据 here 的文档, form.parse 可以采用可选的回调函数。

Parses an incoming node.js request containing form data. If cb is provided, all fields and files are collected and passed to the callback:

form.parse(req, function(err, fields, files) {
  // ... 
});

关于javascript - NodeJS : cannot grab post request text field,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47827262/

相关文章:

javascript - python或JS可以隐藏视频嵌入源吗?

mysql - contains 和 contained in sequelize Where 子句有什么用?

javascript - AJAX 请求已提交,但未收到 POST 值

javascript - 通过 AJAX 发送图像

javascript - Ajax 加载的复选框在 jquery 中显示未定义

javascript - Onclick 将元素设置为相对,否则将其他 div 设置为绝对

javascript - 向上滚动时隐藏和显示导航栏

javascript - 对原型(prototype)链、原语和对象的困惑

javascript - 将数组传递值映射到异步 Puppeteer 函数有时会返回不正确的值

node.js - 使用 Promise 进行流量控制