0

(这是我第一次接触 Javascript。...)

嗨,我必须用Express写一个rest api,这没问题,因为到处都有大量的例子。

不过,在休息请求中,我必须联系另一个 tcp 服务器(用于 modbus)。因此,在这样的请求中,我必须等待来自 socket.connect() 的连接/就绪事件。这样做的正确方法是什么?

我想出的是将 socket.connect() 封装在 Promise 中。剥离的代码如下所示:

function get_holding() {
    const socket = new net.Socket();
    const client = new modbus.client.TCP(socket); /* = require('jsmodbus') */

    return new Promise(function (resolve, reject) {
        // fulfill the Promise, proceed in the chain
        socket.on('ready', function () { resolve(); });

        // close connection after receiving the response
        socket.on('data', function () { socket.end(); });

        socket.on('error', function (error) { reject(error); });
        socket.connect(/* ip and port */);
    })
    .then(function () {
        // could be above in socket.on('ready', ...),
        // but splitting looks better
        return client.readHoldingRegisters(0, 2);
    })
    .then(function (response) {
        // process response (code stripped)
        return /* processed values */;
    })
    .catch(function (error) {
        throw error;
    });
}

function controller_get_holding(req, res) {
    get_holding()
        .then(function (values) {
            res.json(values);
        })
        .catch(function (error) {
            res.send(require('util').inspect(arguments, {depth: null}));
        });
}

...
app.route('/holding')
    .get(controller_get_holding);

这是要走的路吗?

4

1 回答 1

0

刚刚找到promise-socket,这就是我所需要的。

于 2018-10-12T06:47:15.587 回答