簡體   English   中英

500 TypeError:無法讀取未定義的屬性“名稱”,同時將數據從html表單傳輸到Node js服務器?

[英]500 TypeError: Cannot read property 'name' of undefined WHILE transferring data from html form to Node js server?

我正在嘗試將數據從html頁面發送到NodeJS服務器。

我的html代碼是:

<body>

        <nav>
<ul>
<li>
  <a href="#" class="button add">Add Product</a>
  <div class="dialog" style="display:none">
  <div class="title">Add Product</div>
  <form action="addevent" method="get">
    <input id = "name" name="name" type="text" placeholder="Product Name"/>
    <input name="code" type="text" placeholder="Product Code"/>
    <input name="category" type="text" placeholder=" Category"/>
    <input name="brand" type="text" placeholder="Brand"/>
<input type="submit" value="Ok"/>
  </form>
</div>
</li>
<li class="radio">
  <a href="#" class="button active"></a>

  <a href="#" class="button"></a>

  <a href="#" class="button"></a>
</li>
</ul>
</div>        
</nav>
<p></p>
    <script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>

        <script src="js/index.js"></script>




  </body>

我的服務器代碼是:

server.js

var express = require("express"),
    app = express(),
    bodyParser = require('body-parser'),
    errorHandler = require('errorhandler'),
    methodOverride = require('method-override'),
    hostname = process.env.HOSTNAME || 'localhost',
    port = parseInt(process.env.PORT, 10) || 4004,
    publicDir = process.argv[2] || __dirname + '/public';
var exec = require('child_process').exec;
var fs = require('fs');

//Show homepage
app.get("/", function (req, res) {
  res.redirect("/index.html");
});
app.get("/addevent", function (req, res){
   res.send('You sent the name "' + req.body.name + '".');

});

//Search page
app.use(methodOverride());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(express.static(publicDir));
app.use(errorHandler({
  dumpExceptions: true,
  showStack: true
}));

console.log("Server showing %s listening at http://%s:%s", publicDir, hostname, port);
app.listen(port);

但是當我從html頁面提交表單時,它給出了以下錯誤!

 Connect 500 TypeError: Cannot read property 'name' of undefined at app.use.bodyParser.urlencoded.extended (/home/shubham/Music/pricesync/server/server.js:17:45) at Layer.handle [as handle_request] (/home/shubham/Music/pricesync/server/node_modules/express/lib/router/layer.js:95:5) at next (/home/shubham/Music/pricesync/server/node_modules/express/lib/router/route.js:131:13) at Route.dispatch (/home/shubham/Music/pricesync/server/node_modules/express/lib/router/route.js:112:3) at Layer.handle [as handle_request] (/home/shubham/Music/pricesync/server/node_modules/express/lib/router/layer.js:95:5) at /home/shubham/Music/pricesync/server/node_modules/express/lib/router/index.js:277:22 at Function.process_params (/home/shubham/Music/pricesync/server/node_modules/express/lib/router/index.js:330:12) at next (/home/shubham/Music/pricesync/server/node_modules/express/lib/router/index.js:271:10) at expressInit (/home/shubham/Music/pricesync/server/node_modules/express/lib/middleware/init.js:33:5) at Layer.handle [as handle_request] (/home/shubham/Music/pricesync/server/node_modules/express/lib/router/layer.js:95:5) 

在GET HTTP請求中,沒有req.body ,這就是未定義錯誤的原因。 表單字段的值將作為查詢字符串傳遞,因此您需要從req對象讀取查詢字符串值。

嘗試將路由置於中間件下方,並使用“ POST” http動詞。

var express = require("express"),
    app = express(),
    bodyParser = require('body-parser'),
    errorHandler = require('errorhandler'),
    methodOverride = require('method-override'),
    hostname = process.env.HOSTNAME || 'localhost',
    port = parseInt(process.env.PORT, 10) || 4004,
    publicDir = process.argv[2] || __dirname + '/public';
var exec = require('child_process').exec;
var fs = require('fs');

//Search page
app.use(methodOverride());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(express.static(publicDir));

//Show homepage
app.get("/", function (req, res) {
  res.redirect("/index.html");
});

app.post("/addevent", function (req, res){
   res.send('You sent the name "' + req.body.name + '".');
});

app.use(errorHandler({
  dumpExceptions: true,
  showStack: true
}));

console.log("Server showing %s listening at http://%s:%s", publicDir, hostname, port);
app.listen(port);

確保將表單方法也更改為“ post”。

為了將數據從HTML表單發送到服務器,最佳實踐是使用POST方法。 表單提交的默認編碼為:

內容類型:應用程序/ x-www-form-urlencoded

在Express中,您已將bodyParser中間件與json()方法一起使用,該方法不起作用,因為您發送的數據不是JSON編碼的。

您的bodyParser必須像這樣在您的路線之前:

app.use(bodyParser.urlEncoded());
app.post("/addevent", function (req, res){
....

我建議您閱讀初學者的書

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM