gpt4 book ai didi

javascript - node.js 中的未定义错误

转载 作者:行者123 更新时间:2023-11-30 22:58:32 25 4
gpt4 key购买 nike

我想就我一直试图解决的未定义错误寻求帮助,但已经有 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)

最佳答案

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

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

更大的问题是,使用您当前的方法无法完成您尝试做的事情。当模板被渲染并发送到浏览器时,它不再与您的 Node 实例有任何联系。这意味着您不能将内容保存到数据库或直接从 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 模板中。

关于javascript - node.js 中的未定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25111612/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com