问题描述
有什么指点吗?
我的头靠在砖墙上。
我的服务器需要知道客户端的 javascript 并在完成一些计算后重定向用户。 这是我正在尝试做的一步一步:)
- 客户端连接到站点
- 服务器使用 javascript 传递 html,返回有关客户端浏览器的一些信息,即 window.width
- 服务器检索信息
- 服务器根据信息检查一些标准
- 服务器将客户端重定向到适当的 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()
});