【问题标题】:How to post form data in a nodejs application with routes?如何使用路由在 nodejs 应用程序中发布表单数据?
【发布时间】:2017-01-22 01:37:57
【问题描述】:

我尝试使用路由构建一个简单的节点应用程序,但由于无法发布,它给出了 404 网络错误。有人可以指出我的错误并纠正吗?

首先我创建了一个目录 sampProj,然后在其中,我有一个文件 - appl.js 和一个目录 routes。在 routes 目录中,我有一个目录 routes 和一个文件 ma​​in.js。再次在 mainCode 目录中,我有 3 个文件 - main.js、server.js 和 index.html。

对于复杂的方向,我很抱歉,我想进行小规模测试,然后开始构建它。我想提一下,只有 server.js 和 index.html 的代码在没有路由的情况下工作,即 server.js 使用 app.post 和 app.get 等,而不是我在下面显示的相应路由器方法。

下面是应用程序的代码:

appl.js:

var express = require('express');
var bodyParser = require('body-parser');

var app = module.exports.app = express();

// parse application/x-www-form-urlencoded
app.use(bodyParser.urlencoded({ extended: false}));

// parse application/json
app.use(bodyParser.json());

// Adding routes
var server = require(__dirname + '/routes/main');
var mainCode = require(__dirname + '/routes/mainCode/main.js');

app.use('/Service', server);
app.use('/Service/mainCode', mainCode);

// Catch 404 and forward to error handler
app.use(function(req, res, next) {
    var err = new Error('Not Found');
    err.status = 404;
    next(err);
});

/* Error Handlers */
// It will print the Stacktrace of error
if (app.get('env') === 'development') {
  app.use(function(err, req, res, next) {
    res.status(err.status || 500);
    res.send({
      message: err.message,
      error: err
    });
  });
}

app.listen(3000,function(){
    console.log("Working on port 3000");
});

路由/main.js:

var express = require('express');
var router = express.Router();

router.get('/', function(req, res, next) {
    res.send('<code>Welcome to Service</code>');
});

module.exports = router;

mainCode/main.js:

var express = require('express');
var router = express.Router();
var server = require(__dirname + '/server');
router.use('/server', server);
module.exports = router;

mainCode/index.html

<html>
  <head>
    <title>Form Data</title>
 </head>
  <body>
      <form id="uploadForm" enctype="multipart/form-data" action="/" method="post">
      <input id = "userPhotos" type="file" name="userPhotos" multiple />
      <input type='text' id='random' name='random'><br>
      <input type="submit" value="Upload" name="submit">
    </form>
  </body>
</html>

mainCode/server.js:

var express =   require("express");
var router = express.Router();
var multer  =   require('multer');

var storage =   multer.diskStorage({
  destination: function (req, file, callback) {
    callback(null, './uploads/');
  },
  filename: function (req, file, callback) {
    callback(null, file.fieldname + '-' + file.originalname);
  }
});

var upload = multer({ storage : storage }).any();

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

router.post('/',function(req,res){
    console.log("posted");
    console.log("posted");
    console.log(req.body);
    upload(req,res,function(err) {
    if(err) {
        console.error(err);
        return res.end("Error uploading file.");
    }
    console.log(req.body);
    console.log(req.files);
    res.end("File is uploaded");
});
});

module.exports = router;

在浏览器中打开 localhost:3000/Service/mainCode/server 后,会显示一个带有一个文本输入的表单,但如果我提交数据,它会重定向到 localhost:3000,并在屏幕上显示错误 404。

如果您对此投反对票,请告诉我您为什么这样做,以及我可以通过哪些方式改进问题。

【问题讨论】:

    标签: javascript node.js forms express routes


    【解决方案1】:

    您通过 URL 访问表单:

    http://localhost:3000/Service/mainCode/server
    

    对吗? 在您的 mainCode/server.js 中,您为同一 URL 设置了 getpost 处理。 那么为什么在表单提交时调用mainCode/index.html中的根目录:

     <form id="uploadForm" enctype="multipart/form-data" action="/" method="post">
    

    应该是:

    <form id="uploadForm" enctype="multipart/form-data" action="/Service/mainCode/server" method="post">
    

    据我所知。 通常,如果您想将公式发送到相同的 URL,您只需将 action 属性保留为:

    <form id="uploadForm" enctype="multipart/form-data" method="post">
    

    编辑:原来它解决了 OP 的问题,并结合删除属性 enctype,这导致了默认的 application/x-www-form-urlencoded 方法。

    但由于OP一开始想提交文件,他不得不将body-parser模块与multer交换,并再次将enctype设置为multipart/form-data

    multer的文档: https://github.com/expressjs/multer

    【讨论】:

    • 它正在记录日志,但 req.body 正在打印 - {}
    • 你可以试试:app.use(bodyParser.urlencoded({extended: true }));而不是在你的 appl.js 中传递 false
    • 您也可以尝试删除客户端代码上的 enctype 属性,例如:
    • 是的,我在尝试上传文件时保留了它,但后来删除了它以查看它是否至少适用于正常的文本输入
    • 是的,在我将 enctype 更改为 application/x-www-form-urlencoded 后它起作用了,扩展:不需要 true
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-12
    • 2017-03-18
    • 2020-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多