类型错误:提交表单时无法读取未定义的属性(读取“拆分”)

问题描述 投票:0回答:1

我正在为特殊类型的用户制作一个注册页面,表单有一个输入类型文件,即用户个人资料图片,但提交表单时该文件似乎没有发送到服务器端,并且它返回错误“TypeError:无法读取未定义的属性(读取'split')”

由于某种原因,我无法检查服务器端的文件mimetype,这似乎是错误

我在编码这些类型的表单时从未遇到过任何问题,但现在我不知道为什么会发生此错误。

app.post('/cadastroFruteira', function (req, res) {
    try {
        var form = new formidable.IncomingForm();
        form.parse(req, (err, fields, files) => {
            if(files.logo.mimetype){
                if (err) throw (err)
            
                var oldpath = files.logo.filepath;
                var hashImagem = crypto.createHash('md5').update(Date.now().toString()).digest('hex');
                var nomeimg = hashImagem + '.' + files.logo.mimetype.split('/')[1];
                var newpath = path.join(__dirname, 'public/imagens/', nomeimg);
                mv(oldpath, newpath, function (err) {
                    if (err) throw err;
                });

                bcrypt.hash(fields['senha'], saltRounds, function (err, hash) {
                    var sql = "INSERT INTO fruteira (nome, email, CNPJ, senha, endereco, instagram, telefone, logo) VALUES ?";
                    var values = [
                        [fields['nome'], fields['email'], fields['CNPJ'], hash, fields['endereco'], fields['instagram'], fields['telefone'], nomeimg]
                    ];
                    con.query(sql, [values], function (err, result) {
                        if (err) {
                            console.error(err);
                            throw err;
                        }
                        console.log(result.affectedRows);
                    });
                });


            }else{
                throw new Error("Invalid file or mimetype");
            }
        });
    }catch(error){
            throw error;
    }
        res.redirect('/loginFruteira'); // Redirect after database operation
   
});

});

请求发送后,返回消息 Invalid file or mimetype


<!DOCTYPE html>
<html lang="en">

<head>
  <%- include('head'); %>
</head>

<body>
  <%- include('navbar'); %>

    <!--Conteudo-->
    <div class="container mt-5 mb-5">
      <div class="row justify-content-center">
        <form action="/cadastroFruteira" enctype="multipart/form-data" method="POST" class="col-sm-10 col-md-8 col-lg-6 rounded shadow p-5">
          <img src="imagens/logoDobem.png"  class="logo my-0 mt-5" />
          <h1 class="mb-5 mt-2 titleLoginU fw-bold">Cadastrar fruteira</h1>

          <div class="form-floating mb-3">
            <input name="nome" type="text" id="txtNome" class="form-control rounded-pill" placeholder=" " autofocus
              required />
            <label for="txtNome" class="txtNome">Nome da Fruteira</label>
          </div>

          <div class="form-floating mb-3">
            <input name="email" type="email" id="txtEmail" class="form-control rounded-pill" placeholder=" " autofocus
              required />
            <label for="txtEmail" class="txtEmail">E-mail</label>
          </div>

          <div class="form-floating mb-3">
            <input name="CNPJ" type="text" id="txtNome" class="form-control rounded-pill" placeholder=" " autofocus
              required />
            <label for="txtNome" class="txtNome">CNPJ</label>
          </div>

          <div class="form-floating mb-3">
            <input name="senha" type="password" id="txtSenha" class="form-control rounded-pill" placeholder=" "
              required />
            <label for="txtSenha" class="txtSenha">Senha</label>
          </div>

          <div class="form-floating mb-3">
            <input name="senha2" type="password" id="txtSenha" class="form-control rounded-pill" placeholder=" "
              required />
            <label for="txtSenha" class="txtSenha">Repita sua senha</label>
          </div>


          <div class="form-floating mb-3">
            <input name="endereço" type="text" id="txtEndereco" class="form-control rounded-pill" placeholder=" "
              autofocus required />
            <label for="txtEndereco" class="txtNome">Endereço</label>
          </div>

          
          <div class="form-floating mb-3">
            <input type="file" name="logo"id="txtEndereco" class="form-control rounded-pill" placeholder="Logo"
              autofocus required />
          </div>

          <div class="form-floating mb-3 col-md-5">
            <input name="instagram" type="text" id="txtNome" class="form-control rounded-pill" placeholder=" " autofocus
              required />
            <label for="txtNome" class="txtNome"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
                fill="currentColor" class="bi bi-instagram me-3" viewBox="0 0 16 16">
                <path
                  d="M8 0C5.829 0 5.556.01 4.703.048 3.85.088 3.269.222 2.76.42a3.917 3.917 0 0 0-1.417.923A3.927 3.927 0 0 0 .42 2.76C.222 3.268.087 3.85.048 4.7.01 5.555 0 5.827 0 8.001c0 2.172.01 2.444.048 3.297.04.852.174 1.433.372 1.942.205.526.478.972.923 1.417.444.445.89.719 1.416.923.51.198 1.09.333 1.942.372C5.555 15.99 5.827 16 8 16s2.444-.01 3.298-.048c.851-.04 1.434-.174 1.943-.372a3.916 3.916 0 0 0 1.416-.923c.445-.445.718-.891.923-1.417.197-.509.332-1.09.372-1.942C15.99 10.445 16 10.173 16 8s-.01-2.445-.048-3.299c-.04-.851-.175-1.433-.372-1.941a3.926 3.926 0 0 0-.923-1.417A3.911 3.911 0 0 0 13.24.42c-.51-.198-1.092-.333-1.943-.372C10.443.01 10.172 0 7.998 0h.003zm-.717 1.442h.718c2.136 0 2.389.007 3.232.046.78.035 1.204.166 1.486.275.373.145.64.319.92.599.28.28.453.546.598.92.11.281.24.705.275 1.485.039.843.047 1.096.047 3.231s-.008 2.389-.047 3.232c-.035.78-.166 1.203-.275 1.485a2.47 2.47 0 0 1-.599.919c-.28.28-.546.453-.92.598-.28.11-.704.24-1.485.276-.843.038-1.096.047-3.232.047s-2.39-.009-3.233-.047c-.78-.036-1.203-.166-1.485-.276a2.478 2.478 0 0 1-.92-.598 2.48 2.48 0 0 1-.6-.92c-.109-.281-.24-.705-.275-1.485-.038-.843-.046-1.096-.046-3.233 0-2.136.008-2.388.046-3.231.036-.78.166-1.204.276-1.486.145-.373.319-.64.599-.92.28-.28.546-.453.92-.598.282-.11.705-.24 1.485-.276.738-.034 1.024-.044 2.515-.045v.002zm4.988 1.328a.96.96 0 1 0 0 1.92.96.96 0 0 0 0-1.92zm-4.27 1.122a4.109 4.109 0 1 0 0 8.217 4.109 4.109 0 0 0 0-8.217zm0 1.441a2.667 2.667 0 1 1 0 5.334 2.667 2.667 0 0 1 0-5.334z" />
              </svg>Link do instagram</label>
          </div>

          <div class="form-floating mb-3 col-md-5">
            <input name="telefone" type="tel" id="txtTel" class="form-control rounded-pill" placeholder=" " autofocus
              required />
            <label for="tel" class="txtNome"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20"
                fill="currentColor" class="bi bi-whatsapp me-3" viewBox="0 0 16 16">
                <path
                  d="M13.601 2.326A7.854 7.854 0 0 0 7.994 0C3.627 0 .068 3.558.064 7.926c0 1.399.366 2.76 1.057 3.965L0 16l4.204-1.102a7.933 7.933 0 0 0 3.79.965h.004c4.368 0 7.926-3.558 7.93-7.93A7.898 7.898 0 0 0 13.6 2.326zM7.994 14.521a6.573 6.573 0 0 1-3.356-.92l-.24-.144-2.494.654.666-2.433-.156-.251a6.56 6.56 0 0 1-1.007-3.505c0-3.626 2.957-6.584 6.591-6.584a6.56 6.56 0 0 1 4.66 1.931 6.557 6.557 0 0 1 1.928 4.66c-.004 3.639-2.961 6.592-6.592 6.592zm3.615-4.934c-.197-.099-1.17-.578-1.353-.646-.182-.065-.315-.099-.445.099-.133.197-.513.646-.627.775-.114.133-.232.148-.43.05-.197-.1-.836-.308-1.592-.985-.59-.525-.985-1.175-1.103-1.372-.114-.198-.011-.304.088-.403.087-.088.197-.232.296-.346.1-.114.133-.198.198-.33.065-.134.034-.248-.015-.347-.05-.099-.445-1.076-.612-1.47-.16-.389-.323-.335-.445-.34-.114-.007-.247-.007-.38-.007a.729.729 0 0 0-.529.247c-.182.198-.691.677-.691 1.654 0 .977.71 1.916.81 2.049.098.133 1.394 2.132 3.383 2.992.47.205.84.326 1.129.418.475.152.904.129 1.246.08.38-.058 1.171-.48 1.338-.943.164-.464.164-.86.114-.943-.049-.084-.182-.133-.38-.232z" />
              </svg>Número do WhatsApp</label>
          </div>


          <button type="submit" class="btn btn-success px-5 py-3 rounded-pill">
            Cadastrar
          </button>

          <p class="mt-3 spanOp">
            Ja possui conta?
            <a href="/loginFruteira">Clique aqui</a> para entrar.
          </p>
          <p class="mt-3 text-success">
            Deseja entrar como cliente?
            <a href="/loginUsuario">Clique aqui</a> para acessar sua conta.
          </p>
        </form>
      </div>
    </div>
    <!--ConteudoFim-->

    <!--Footer-->
    <footer class="shadow">
      <%- include('footer'); %>
    </footer>
    <!--FooterFim-->

</body>

</html>

node.js forms ejs mime-types formidable
1个回答
0
投票

好吧,我不久前已经解决了这个问题,但我真的没有找出是什么导致了这个问题,所以我决定使用 Multer 而不是 Formidable,它工作得很好

© www.soinside.com 2019 - 2024. All rights reserved.