Express JS res.send() 然后 res.redirect

问题描述

有什么指点吗?

我的头靠在砖墙上。

我的服务器需要知道客户端的 javascript 并在完成一些计算后重定向用户。 这是我正在尝试做的一步一步:)

  1. 客户端连接到站点
  2. 服务器使用 javascript 传递 html,返回有关客户端浏览器的一些信息,即 window.width
  3. 服务器检索信息
  4. 服务器根据信息检查一些标准
  5. 服务器将客户端重定向到适当的 IP 地址

Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client

代码末尾抛出:res.redirect('192.168.1.254')

//Send javascript to client
app.get('/',(req,res,next) => {
    res.send(`
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        var info = {
            clientwidth: 'test',clientheight: 'test',clientspeed: 'test'
            };
        var objectData = JSON.stringify(info);
        $.post('/',{ clientInfo: objectData });
        }
    </script>
    `)
    return next()
});

// Read javascript object clientInfo
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));
app.post('/',next) => {
    let clientInfo = req.body.clientInfo;
    res.json({ok: true});
    console.log('Client connected: ' + clientInfo);
    return next()
});

app.get('/',res) => {
    res.redirect('192.168.1.254')
})

解决方法

所以,不可能先 res.send() 然后 res.redirect()。您的 return next() 正在推送要在下一个中间件执行的代码。

您的第一个 get 方法和第二个 get 方法存在冲突,因为两者都有响应。您只能对客户做出一种回应。

检查这个:res.send(),then res.redirect()

更新:

检查下面的代码。这可能对您提到的流程有所帮助。 (查看评论以获取步骤和详细信息的参考)

// Step 1: Add your middlewares.
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({extended: true}));


//STEP 2 : Send your JS code to client.
app.get('/',(req,res,next) => {
    res.send(`
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>
    <script>
        var info = {
            clientwidth: 'test',clientheight: 'test',clientspeed: 'test'
            };
        var objectData = JSON.stringify(info);
        $.post('/',{ clientInfo: objectData });
        }
    </script>
    `)

    // Avoid return next() if you've already returned a response.
    //return next()    
});


// Step 3: Get details from the client and analyse it 
app.post('/',next) => {
    let clientInfo = req.body.clientInfo;
    res.json({ok: true});
    console.log('Client connected: ' + clientInfo);
    
    // If the details from client has been pre-procesed successfully,redirect the client.
    res.redirect('192.168.1.254')
    
    // Avoid return next() if you've already returned a response.
    //return next()   
});