首页 > 解决方案 > Nodejs-异步函数-TypeError:无法设置未定义的属性“温度”

问题描述

JavaScript 初学者在这里,我正在尝试使用 hap-nodejs 模块在 Nodejs 中进行一些操作。

我的主文件如下所示:

const config = require('../config');
const Syno = require('synology');
const docker = new Docker(config.dockerode);
const storage = require('node-persist');
const os = require('os');
storage.initSync();
const {Bridge, uuid, Categories} = require('hap-nodejs');
const TemperatureSensorAccessory = require('./TempGageAccessory');

const name = config.bridge.deviceName.replace('$hostname', os.hostname()).replace(/\./, ' ');
const bridge = new Bridge(name, uuid.generate('Remote Bridge'));

bridge.publish({
    username: config.bridge.mac,
    port: config.bridge.port,
    pincode: config.bridge.pincode,
    category: Categories.BRIDGE
});

async function publishSynology()
{
    const dev = new TemperatureSensorAccessory('NAS_SYS_TEMP');
    bridge.addBridgedAccessories({
        accessory: dev.getAccessory()
    });
}

publishSynology();

和我的 /TempGageAccessory.js 文件,问题出在这里:

const {Accessory, Service, Characteristic, uuid, Categories} = require('hap-nodejs');
const Syno = require('synology');
const {emitter, docker} = require('./DockerKit');

module.exports = class TemperatureSensorAccessory {
    constructor(name) {
        console.log('Constructing ' + name);
        this.TemperatureSensor = {
            name,
            model: 'Synology NAS Temperature Sensor',
            category: Categories.SENSOR,
            description: name,
            setTemperature:  function () {
                let syno = new Syno({
                    host    : '10.0.0.1',
                    port    : '5656',
                    secure  : 'true',
                    user    : 'user',
                    password: 'password'
                });

                syno.query('/webapi/entry.cgi', {
                    api    : 'SYNO.Core.System',
                    version: 1,
                    method : 'info'
                }, function(err, data) {
                    if (err) return console.error(err);
                    console.log(data['data']['sys_temp']);
                    this.temperature = parseFloat(data['data']['sys_temp']);
                    return parseFloat(data['data']['sys_temp']);
                });
            },
            temperature: 0.0,
            getTemperature: async function () {
                console.log('[' + name + '] Getting Temperature' + this.temperature);
                return this.temperature;
            },
            uuid: uuid.generate('hap-nodejs:accessoires:temperaturesensor:synology:' + name),
            accessory: null
        };
        const that = this;
        that.TemperatureSensor.setTemperature();
        that.getAccessory().getService(Service.TemperatureSensor).getCharacteristic(Characteristic.On).updateValue(that.TemperatureSensor.temperature);

     }

    getAccessory() {
        if (!this.TemperatureSensor.accessory) {
            let acc;
            acc = new Accessory(this.TemperatureSensor.name, this.TemperatureSensor.uuid);
            acc.username = '8a:bc:80:74:de:16';
            acc.pincode = '123-45-678';
            acc
                .addService(Service.TemperatureSensor, this.TemperatureSensor.name)
                .getCharacteristic(Characteristic.CurrentTemperature)
                .on('get', async(cb) => {

                    // return our current value
                    cb(null, await this.TemperatureSensor.getTemperature());
                  });
            this.TemperatureSensor.accessory = acc;
            return acc;
        } else return this.TemperatureSensor.accessory;
    }
};

我几乎得到了一切,我的休息电话工作正常,我正在返回我的数据。但是当我尝试将查询结果分配给属性温度时,我收到以下错误:

TypeError:无法设置未定义的属性“温度”

请,有人可以解释我做错了什么吗?我不是 Javascript 开发人员,第一次使用它来自 C#/Python。

标签: javascriptnode.js

解决方案


初学者错误,通过裁判正确的对象来修复。


推荐阅读