Обновления изменили код
Я пытаюсь работать с socket.io и nodeJS, так как я все еще начинающий с обоими, и я не могу заставить его работать. Поэтому я нашел этот пример и попытался реализовать его https://github.com/priyanshrastogi/temperature-plot/blob/master/index.js
Я хочу показать данные с моего ESP8266 (это часть работы, я собираю данные). Я хочу отобразить эти данные, когда пользователь переходит на localhost: 4000 / sensor. Когда пользователь переходит на localhost: 4000 /, тогда я рендерить другую страницу (эта страница работает). Но данные на странице датчика не работают. Я думаю, потому что эта ошибка Ошибка: нет такого файла или каталога, не может открыть COM3
Это мой код узла JS
var express = require('express')
var app = require('express')()
var server = require('http').createServer(app)
var session = require('express-session')
var bodyParser = require('body-parser')
var request = require('request-promise')
var mongoose = require('mongoose')
var io = require('socket.io').listen(server)
const SerialPort = require('serialport')
const port = new SerialPort('\\\\.\\COM3', {baudRate: 9600}, function (err) {
if (err) {
return console.log('Error: ', err.message)
}
})
port.on('data', (temp) => { //Read data
console.log(temp);
var today = new Date();
io.sockets.emit('temp', {date: today.getDate()+"-"+today.getMonth()+1+"-"+today.getFullYear(), time: (today.getHours())+":"+(today.getMinutes()), temp:temp})
});
io.on('connection', (socket) => {
console.log("Someone connected.");
})
require('dotenv').config()
mongoose.connect(process.env.MONGO_URI, { useNewUrlParser: true })
var citySchema = new mongoose.Schema({
name: String
})
var cityModel = mongoose.model('City', citySchema)
async function collectWeather(cities) {
var weatherData = []
for (var city_object of cities) {
var city = city_object.name
var url = `http://api.openweathermap.org/data/2.5/weather?q=${city}&units=metric&appid=ef28c61a2416a123137107cf00536b5b`
request(url)
var body = await request(url)
var weatherJSON = JSON.parse(body)
var weather = {
city: city,
temperature: Math.round(weatherJSON.main.temp),
description: weatherJSON.weather[0].description,
icon: weatherJSON.weather[0].icon,
}
weatherData.push(weather)
}
return weatherData
}
express()
app.use(express.static('static'))
app.use(bodyParser.urlencoded({extended: true}))
app.use(session({
resave: false,
saveUninitialized: true,
secret: process.env.SESSION_SECRET
}))
app.set('view engine', 'ejs')
app.set('views', 'view')
app.get('/', function(req, res) {
cityModel.find({}, function(err, cities) {
collectWeather(cities).then(function(result) {
var weatherData = {weatherData: result}
res.render('index', weatherData)
}).catch(err => {
console.log(err)
res.render('error', err)
})
})
})
app.post('/', function(req, res) {
var newCity = new cityModel({name: req.body.city_name})
newCity.save()
.then(result => {
res.redirect('/')
}).catch(err =>{
console.log(err)
res.render('error', err)
})
})
app.get('/sensor', function(req,res) {
res.render('sensor')
})
server.listen('4000', () => {
console.log('Server listening on Port 4000');
})
А это мой Javascript
var socket = io.connect('http://localhost:4000'); //connect to server
var ctx = document.getElementById('myChart').getContext('2d');
var chart = new Chart(ctx, {
// The type of chart we want to create
type: 'line',
// The data for our dataset
data: {
labels: [],
datasets: [{
label: "Temperature",
borderColor: "#FF5733",
data: [],
fill: false,
pointStyle: 'circle',
backgroundColor: '#3498DB',
pointRadius: 5,
pointHoverRadius: 7,
lineTension: 0,
}]
},
// Configuration options go here
options: {}
});
socket.on('temp', function(data) { //As a temp data is received
console.log(data.temp)
document.getElementById('date').innerHTML = data.date //update the date
if(chart.data.labels.length != 15) { //If we have less than 15 data points in the graph
chart.data.labels.push(data.time) //Add time in x-asix
chart.data.datasets.forEach((dataset) => {
dataset.data.push(data.temp) //Add temp in y-axis
});
}
else { //If there are already 15 data points in the graph.
chart.data.labels.shift() //Remove first time data
chart.data.labels.push(data.time) //Insert latest time data
chart.data.datasets.forEach((dataset) => {
dataset.data.shift() //Remove first temp data
dataset.data.push(data.temp) //Insert latest temp data
});
}
chart.update() //Update the graph.
})
Заранее спасибо!