TypeError:无法读取未定义节点js的属性“名称”

时间:2019-04-22 09:24:08

标签: node.js express

我在index.html文件上有文件提交表单。选择文件后,我需要说“文件已上传”,否则需要显示“请上传文件”

app.js

    const express = require("express");
    const app = express();
    const http = require("http").Server(app).listen(3000);

    app.use(express.urlencoded());
    app.use(express.json());

    console.log("Server Started");

    app.get("/", function (req, res) {
    res.sendFile(__dirname + "/index.html");
    }
    )

    app.post("/", function (req, res) {
    if (req.files) {

        console.log(req.files);
        const file = req.files.filename;
        const filename = file.name;

        if (!filename) {
        res.send("Please select the file to upload");
        }
        else {
        res.send("uploaded");
        }
    }
    })

index.html

    <div>
    <h1 style="align-content: center">Upload your file here!</h1>
    </div>
    <div >

    <form label="upload" method="post" enctype="multipart/form-data" action="/">
        <label> Enter reference</label>
        <input type="text" name="test_text"></input>
        <br><br>
        <input type="file" name="filename">
        <input type="submit" value="upload">
    </form>
    </div>

错误消息:

TypeError: Cannot read property 'name' of undefined
    at C:\Users\Desktop\LocalGithub\uploadFileLocal-express-fileupload\app.js:24:27

3 个答案:

答案 0 :(得分:2)

以下内容摘自快速文档:

  

在Express 4中,默认情况下req.files在req对象上不再可用。要访问req.files对象上的已上传文件,请使用多部分处理中间件,例如busboy,multer,emmable,multiparty,connect-multiparty或pez。

如前所述,我建议您使用multer,因为它更受欢迎且易于使用

编辑:

如果您使用的是“ express-fileupload”中间件,则必须通过.use()方法进行加载:

const express = require("express");
const app = express();
const http = require("http").Server(app).listen(3000);
const fileUpload = require('express-fileupload');
^^^^^

app.use(express.urlencoded());
app.use(express.json());

app.use(fileUpload({
^^^
    useTempFiles : true,
    tempFileDir : '/tmp/'
}));

...

检查docs以获得更多详细信息:

答案 1 :(得分:0)

请尝试将file.name替换为req.files[0].originalname

答案 2 :(得分:0)

您没有创建定义了属性名称的对象。 对象:req.files.filename,属性:req.files.filename.name 应该可以正常工作。 你的代码应该是这样的:

app.post("/", function (req, res) {
    if (req.files.filename) {   //missing filename

        console.log(req.files.filename); //missing filename
        const file = req.files.filename;
        const filename = file.name;
  ...
});