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)
【问题讨论】:
在我看来您没有将pin7On
和 pin7Off
传递给您的视图?
不,只是将它们作为函数传递给我的按钮,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(即$
),或者只使用XMLHttpRequest
和addEventListener
。
抱歉,nickclaw,如何设置 jQuery 或 addEventListener,并添加 .js 或 .ejs?有点困惑,希望你能指导我,尼克克劳。以上是关于node.js 中的未定义错误的主要内容,如果未能解决你的问题,请参考以下文章