无法读取 Node JS 中未定义的属性“名称”
Posted
技术标签:
【中文标题】无法读取 Node JS 中未定义的属性“名称”【英文标题】:Cannot read property 'name' of undefined in Node JS 【发布时间】:2018-01-27 00:30:41 【问题描述】:我是 Node js 的新手。我正在尝试使用 mysql 在节点 js 中制作 CRUD 应用程序。但我面临着我无法理解或处理的错误。请帮忙。并在 adv 中表示感谢。
我无法将输入字段值从 ejs 页面读取到 server.js 页面。
下面给出了我的 server.js 文件
// server.js
var express = require('express');
var app = express();
var bodyParser = require('body-parser');
var mysql = require('mysql');
var con = mysql.createConnection(
host: "localhost",
user: "root",
password: "",
database: "tuts_rest"
);
// set the view engine to ejs
app.set('view engine', 'ejs');
// about page
app.get('/about', function(req, res)
res.render('pages/about');
);
app.post('/insert', function(req,res)
con.connect();
console.log(req.body.name);
con.query("INSERT INTO users(name,email,country) VALUES('"+req.body.name+"','"+req.body.email+"','"+req.body.country+"')", function(err, results)
if (!err)
res.send('Inserted Successfully!')
else
throw error;
);
con.end();
);
app.listen(8080);
console.log('8080 is the magic port');
我正在使用表单发送以下数据
<form role="form" action="/insert" method="POST">
<div class="form-group">
<label for="lname">Name:</label>
<input type="text" class="form-control" id="name" name="name" required>
</div>
<div class="form-group">
<label for="email">Email address:</label>
<input type="email" class="form-control" id="email" name="email" required>
</div>
<div class="form-group">
<label for="country">Country:</label>
<input type="text" class="form-control" id="country" name="country">
</div>
<button type="submit" class="btn btn-default">Submit</button>
</form>
错误如下所示
TypeError: Cannot read property 'name' of undefined
at E:\xampp\htdocs\node\basic\server.js:40:22
at Layer.handle [as handle_request] (E:\xampp\htdocs\node\basic\node_modules\express\lib\router\layer.js:95:5)
at next (E:\xampp\htdocs\node\basic\node_modules\express\lib\router\route.js:137:13)
at Route.dispatch (E:\xampp\htdocs\node\basic\node_modules\express\lib\router\route.js:112:3)
at Layer.handle [as handle_request] (E:\xampp\htdocs\node\basic\node_modules\express\lib\router\layer.js:95:5)
at E:\xampp\htdocs\node\basic\node_modules\express\lib\router\index.js:281:22
at Function.process_params (E:\xampp\htdocs\node\basic\node_modules\express\lib\router\index.js:335:12)
at next (E:\xampp\htdocs\node\basic\node_modules\express\lib\router\index.js:275:10)
at expressInit (E:\xampp\htdocs\node\basic\node_modules\express\lib\middleware\init.js:40:5)
at Layer.handle [as handle_request] (E:\xampp\htdocs\node\basic\node_modules\express\lib\router\layer.js:95:5)
【问题讨论】:
console.log(req.body.name);
有输出吗?
no.. 它什么也不返回..@Jehy
这就是问题所在。当您将数据发布到您的网络服务器时,请尝试发送name
参数。
它也终止了服务器..
【参考方案1】:
要求body-parser
不会做任何事情。
你需要让 express 实际使用它。
// accept url encoded
app.use(bodyParser.urlencoded(
extended: true
));
// accept json
app.use(bodyParser.json());
注意:
您的查询对 sql 注入开放。使用准备好的语句或使用像 knex 这样的查询构建器来为您完成。
不要一个接一个地创建和管理连接,而是使用连接池。为此,请使用mysql.createPool
而不是mysql.createConnection
【讨论】:
它可以工作,但会留下类似的消息,body-parser deprecated bodyParser: use individual json/urlencoded middlewares...这是什么意思? 别以为你用过extended : true
。添加它,警告就会消失。以上是关于无法读取 Node JS 中未定义的属性“名称”的主要内容,如果未能解决你的问题,请参考以下文章
如何修复'TypeError:无法读取 Javascript 中未定义的属性'标题'
无法在下一个 js 上读取 firebase 中未定义的属性“长度”