无法读取 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 中未定义的属性“名称”的主要内容,如果未能解决你的问题,请参考以下文章

无法读取 discord.js 中未定义的属性“发送”

如何修复'TypeError:无法读取 Javascript 中未定义的属性'标题'

TypeError:无法读取反应js中未定义的属性'fn'

无法在下一个 js 上读取 firebase 中未定义的属性“长度”

当不应该在 discord.js 命令处理程序中未定义时,无法读取未定义的属性

Discord.js - 无法读取 execute() 方法中未定义的属性