【问题标题】:Formidable returns TypeError, ERR_INVALID_ARG_TYPE: The "path" argument is undefined强大的返回 TypeError,ERR_INVALID_ARG_TYPE:“路径”参数未定义
【发布时间】:2022-01-21 11:48:10
【问题描述】:

我在使用 formidable 上传文件时遇到问题。我在 Windows Server 2016 上。

我的代码完全如下所示,基于https://www.geeksforgeeks.org/how-to-upload-file-using-formidable-module-in-node-js/

const express = require('express');
const fs = require('fs');
const path = require('path')
const formidable = require('formidable');
   
const app = express();
   
app.post('/api/upload', (req, res, next) => {
    
    const form = new formidable.IncomingForm(
        { uploadDir: __dirname + '\\tmp',  keepExtensions: true }
    );
    form.parse(req, function(err, fields, files){
        var oldPath = files.profilePic.path;
        var newPath = path.join(__dirname, 'uploads')
                + '/'+files.profilePic.name
        var rawData = fs.readFileSync(oldPath)
      
        fs.writeFile(newPath, rawData, function(err){
            if(err) console.log(err)
            return res.send("Successfully uploaded")
        })
  })
});
   
app.listen(3000, function(err){
    if(err) console.log(err)
    console.log('Server listening on Port 3000');
});

我使用 Postman 发送文件。

在触发/api/upload API时,发送的文件正确放置在tmp文件夹中,但读取路径时出现问题:

TypeError [ERR_INVALID_ARG_TYPE]: The "path" argument must be of type string or an instance of Buffer or URL. Received undefined

此消息指向fs.readFileSync(oldPath)

console.log('files='+files) 返回files=[object Object]

console.log('files.profilePic='+files.profilePic)返回

C:\somepath\node_modules\formidable\src\PersistentFile.js:50
    return `PersistentFile: ${this._file.newFilename}, Original: ${this._file.originalFilename}, Path: ${this._file.filepath}`;
                                         ^

TypeError: Cannot read properties of undefined (reading 'newFilename')
    at PersistentFile.toString (C:\somepath\node_modules\formidable\src\PersistentFile.js:50:42)

所有 4 个引用的模块都存在于 node_modules 文件夹中。

【问题讨论】:

  • 只是为自己尝试,但对我来说,“文件”表示某种文件数组。所以也许看看files[0]是什么
  • 以上评论不正确

标签: node.js file-upload formidable


【解决方案1】:

简单的改变

var oldPath = files.profilePic.path;

var oldPath = files.profilePic.filepath;

还要确保创建“上传”文件夹,因为代码不会创建它,没有它就会失败。

编辑:附带说明的是,如果您的环境只是在控制台记录对象时吐出 [object object],那么可能会获得一个新环境(Visual Studio 代码很好),它会提供有用的信息。

【讨论】:

  • Sam Dean,非常感谢!我想知道为什么我读过的每个教程都使用“路径”而不是“文件路径”,最近在回调方面有什么变化吗?另外,感谢您指出需要适当的 IDE。我是一名Java开发人员,所以我习惯使用Eclipse。不幸的是,由于安装过程中缺少在线资源(奇怪!),我无法安装 Node 插件,所以我尝试了 Atom。这里的调试器也无法安装,所以我最终使用了 Edge。 Visual Studio 是开发和调试 Node.js 应用的最佳方式吗?
  • 别担心!我很幸运,Visual Studio Code 输出了整个对象及其所有成员变量,我看到“文件路径”而没有“路径”,试了一下,它成功了!
  • @JanusEngstrøm 对于新的 node.js 项目,我的设置如下。 1.) 创建一个新文件夹。 2.) 在该文件夹中创建一个新的 git repo。 3.) 在 VSC (visual studio code) 中打开该文件夹 4.) 从 VSC 打开一个新终端,“ctrl+shift+'” 或“终端 > 新终端” 5.) 在终端中执行 npm init 并填写选项 6.) 使用 npm i eslintnpx eslint --init 设置一个 linter(让您遵守最佳实践代码标准)并填写选项。 7.) 在 VSC 扩展中获得 Microsoft 的“ESLint”,以便 eslint 可以实际显示在代码中 8.) 最后我使用 nodemon 实时重新加载我的代码
  • (续)当我通过运行npm i nodemon 进行更改以安装它,然后在我的“package.json”中,在“脚本”部分添加'“live”:“nodemon index.js " ' 然后你可以从命令行运行npm run live,它会运行你的 index.js 并在你保存对代码的更改时重新运行它。祝你好运!
猜你喜欢
  • 2022-01-12
  • 2021-09-08
  • 2020-12-30
  • 2020-09-21
  • 1970-01-01
  • 2021-12-12
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多