首页 > 解决方案 > 将标头发送到客户端 Expressjs 路由器后无法设置标头

问题描述

我收到错误无法在 express js 上设置标题,我认为问题是必须编写 setHeader,我已设置但仍不能,这是我的代码:

router.get('/cek', (req, res) => {
const child = execFile(commandd, ['-c', 'config', 'GSM.Radio.C0']);
child.stdout.on('data', 
    function (data) {
        value = (JSON.stringify(data));
        x = value.split('.');
        y = JSON.stringify(x[2])
        result = y.replace(/\D/g, "");
        res.setHeader('Content-Type', 'text/html');
        res.send(result);
    }
);

child.stderr.on('data',
    function (data) {
        console.log('err data: ' + data);
    }
);

});

我厌倦了两天修复这个错误,但仍然不能,有人可以帮忙吗?

标签: javascriptexpressvue.js

解决方案


正如Frederico Ibba 所说,这通常是在发送 res.send 并且仍在处理数据之后引起的......您的解决方法可能只是在使用 .send 发送之前接收所有数据res.send。你可以试试这个。

async function executeCommand() {
    return new Promise((resolve, reject) => {
        const child = execFile(commandd, ['-c', 'config', 'GSM.Radio.C0']);

        child.stdout.on('data', 
             function (data) {
                value = (JSON.stringify(data));
                x = value.split('.');
                y = JSON.stringify(x[2])
                result = y.replace(/\D/g, "");

                resolve(result);
             }
        );

        child.stderr.on('data',
           function (err) { // Renamed data for err for clarification
               reject(err);
           }
        );
    });
}

router.get('/url', async (req, res) => {
    try {
        const result = await executeCommand();
        res.setHeader('Content-Type', 'text/html');
        res.send(result);
    } catch(error) {
        // There was an error. I'm throwing a 500
        res.sendStatus(500);
    }
});

请注意,只有当您确信数据被触发一次时,这才会有效,如裙子所示


推荐阅读