node.js 中的未定义错误

Posted

技术标签:

【中文标题】node.js 中的未定义错误【英文标题】:Undefined errors in node.js 【发布时间】:2014-09-26 12:13:49 【问题描述】:

我想就未定义的错误寻求帮助,但我已经尝试解决 2 周了。我正在尝试创建一个具有开/关功能的按钮。如果用户单击 On 按钮,它将点亮我的 LED,并将用户单击它的时间存储到 mysql 数据库中。希望大家能尽快帮帮我,在此先感谢各位。

这是我的 app.js:

var express = require('express');
var path = require('path');
var favicon = require('static-favicon');
var logger = require('morgan');
var cookieParser = require('cookie-parser');
var bodyParser = require('body-parser');
var index = require('./routes/index');
var pin = require('./routes/pin');
var app = express();

// View engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'ejs');
app.set('port', process.env.PORT || 3000);

app.use(favicon());
app.use(logger('dev'));
app.use(bodyParser.json());
app.use(bodyParser.urlencoded());
app.use(cookieParser());
app.use(express.static(path.join(__dirname, 'public')));

app.use('', index);
app.use('/pin', pin);

// 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

// development error handler
// will print stacktrace
if (app.get('env') === 'development') 
    app.use(function(err, req, res, next) 
        res.status(err.status || 500);
        res.render('error', 
            message: err.message,
            error: err
        );
    );


// production error handler
// no stacktraces leaked to user
app.use(function(err, req, res, next) 
    res.status(err.status || 500);
    res.render('error', 
        message: err.message,
        error: 
    );
);

module.exports = app;
var server = app.listen(app.get('port'), function() 
  console.log('Listening on port %d', server.address().port);
);

这是我的 index.js:

var express = require('express');
var router = express.Router();
var mysql = require('mysql');
var gpio = require('pi-gpio');

var conn = 
    host: 'localhost',
    user: 'user',
    password: 'password',
    database: 'rest_api',
    port: '3306'
;

router.get('/', function(req, res) 
    var pin = req.params.pin;
    var connection = mysql.createConnection(conn);
    var querySensorInfo ='SELECT sensorId, sensor, pinNo, sensorType FROM sensorInfo';

    connection.query(querySensorInfo, function(err, rows, fields) 
            if (err) 
            throw err;
        
        console.log(rows);
            res.render('index',  
            title: 'Sensor Rest API', 
            sensorInfoData: rows
        );    
    );

    var pin7On = gpio.open(7, 'output', function(err) 
            if ('output' == 1) 
                gpio.write(7, 1, function(err) 
                    connection.query('INSERT INTO sensorLog(sensorId, logTime, sensorValue) VALUES(1, current_timestamp(), 1)', function(err) 
                        if (err) 
                            throw err;
                             else 
                            console.log("Successfully store to mySQL database");
                        
                    );
                        gpio.close(7);
                );
            
    );

    var pin7Off = gpio.open(7, 'output', function(err) 
            if ('output' == 0) 
                gpio.write(7, 0, function(err) 
                    connection.query('INSERT INTO sensorLog(sensorId, logTime, sensorValue) VALUES(1, current_timestamp(), 1)', function(err) 
                        if (err) 
                            throw err;
                             else 
                            console.log("Successfully store to mySQL database");
                        
                    );
                        gpio.close(7);
                );
            
    );

);

module.exports = router;

这是我的 /view/index.ejs:

<!DOCTYPE html>
<html>
  <head>
    <title><%= title %></title>
    <link rel='stylesheet' href='/stylesheets/style.css' />
  </head>
  <body>
    <h1 align="center">
    <%= title %>
    </h1>
    <p align="center">
    This are the <b>Sensors Information Log</b>, which shows what sensor are available to activate.
    </p>
    <table border="1" cellpadding="2" cellspacing="2" align="center">
    <tr>
         <th>Sensor ID</th>
         <th>Sensor</th>
         <th>Pin Number</th>
         <th>Sensor Type</th>
    </tr>
    <% for(var i = 0; i < sensorInfoData.length; i++)  %>
        <tr align="center">
             <td><%= sensorInfoData[i].sensorId%></td>
             <td><%= sensorInfoData[i].sensor%></td>
             <td><%= sensorInfoData[i].pinNo%></td>
             <td><%= sensorInfoData[i].sensorType%></td>
        </tr>
    <%  %>
    </table>
    <button value=1 onClick=<%= pin7On%>>ON</button> 
    <button value=0 onClick=<%= pin7Off%>>>OFF</button>
  </body>
</html>

这是错误信息:

/var/www/views/index.ejs:30 28| <%  %> 29| </table> >> 30| <button value=1 onClick=<%= pin7On%>>ON</button> 31| <button value=0 onClick=<%= pin7Off%>>>OFF</button> 32| </body> 33| </html> pin7On is not defined

undefined

ReferenceError: /var/www/views/index.ejs:30
    28|     <%  %>
    29|     </table>
 >> 30|     <button value=1 onClick=<%= pin7On%>>ON</button> 
    31|     <button value=0 onClick=<%= pin7Off%>>>OFF</button>
    32|   </body>
    33| </html>

pin7On is not defined
    at eval (eval at <anonymous> (/var/www/node_modules/ejs/lib/ejs.js:237:14), <anonymous>:29:1141)
    at eval (eval at <anonymous> (/var/www/node_modules/ejs/lib/ejs.js:237:14), <anonymous>:29:1277)
    at /var/www/node_modules/ejs/lib/ejs.js:250:15
    at Object.exports.render (/var/www/node_modules/ejs/lib/ejs.js:288:13)
    at View.exports.renderFile [as engine] (/var/www/node_modules/ejs/lib/ejs.js:318:20)
    at View.render (/var/www/node_modules/express/lib/view.js:76:8)
    at Function.app.render (/var/www/node_modules/express/lib/application.js:503:10)
    at ServerResponse.res.render (/var/www/node_modules/express/lib/response.js:802:7)
    at Query._callback (/var/www/routes/index.js:24:11)
    at Query.Sequence.end (/var/www/node_modules/mysql/lib/protocol/sequences/Sequence.js:96:24)

【问题讨论】:

在我看来您没有将 pin7Onpin7Off 传递给您的视图? 不,只是将它们作为函数传递给我的按钮,Brendan Scarvell 【参考方案1】:

首先,@brenden-scarvell 说得对,错误源于您在渲染模板时没有传入这些变量。

res.render('index', 
    title: 'title',
    sensorInfoData: data,
    pin7On: pin7On,
    pin7Off: pin7Off
):

更大的问题是,使用当前的方法,您尝试做的事情是不可能的。当模板被渲染并发送到浏览器时,它不再与您的节点实例有任何连接。这意味着您不能将内容保存到数据库或直接从onClick 侦听器执行任何 服务器端代码。相反,您将需要使用 ajax 请求在浏览器和服务器之间进行通信。

首先,您需要修改路由器以添加更多通信点。比如:

router.post('/pin7Off', function() 
    // database stuff in here
    // send success response when done
);

router.post('/pin7On', function() 
    // database stuff in here
    // send success response when done
);

现在在您的模板中。添加在单击按钮时向服务器发送 AJAX 请求的代码。以下是您在 jQuery 中的大致操作方式。

$("#buttonOne").on('click', function() 
    $.ajax(
        url: '/pin7On',
        method: 'POST'
    );
);

请记住,上面的代码将在您发送到浏览器的 ejs 模板中。

【讨论】:

谢谢 nickclaw,但我遇到了一些错误,首先是当我设置你给我的 index.js 的方法时没有定义 $。在我尝试删除 $ 后,它显示 Object #pin7OnButton 没有“on”方法。希望你能尽快帮我解决这个问题,提前感谢,nickclaw 查看 jQuery(即$),或者只使用XMLHttpRequestaddEventListener 抱歉,nickclaw,如何设置 jQuery 或 addEventListener,并添加 .js 或 .ejs?有点困惑,希望你能指导我,尼克克劳。

以上是关于node.js 中的未定义错误的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 中的错误“未定义窗口”

js node.js中的窗口未定义错误

C ++ / Eclipse中的未定义符号错误[关闭]

PHP包含文件中的未定义变量错误[重复]

错误:使用 Sass 的 Angular 组件中的未定义变量

如何修复符号查找错误:集群环境中的未定义符号错误