我正在使用一个简单的expressJS应用程序。
server = app.listen(config.port, () => {
logger.info(`Listening to port ${config.port}`);
});
我试图区分多个请求是来自同一设备还是来自不同设备。是否有一个唯一的ID,或者我可以从express中的
req
对象中获取什么?
我尝试检查用户代理和 IP 地址。但这些并不是该设备所独有的。
您可以使用 node-machine-id 库来获取设备唯一 ID。
您可以将调用者机器 ID 提供给 REST API 调用的标头。 可以比较服务器的机器ID,比较是否相同。
如果相同,请从同一设备拨打电话。
如果不相同,请从其他设备调用。
演示 server.js 和 clinet.js
服务器.js
const express = require("express")
const cors = require("cors")
const machineId = require('node-machine-id')
const app = express()
app.use(cors())
PORT = 3000
const serverDeviceId = machineId.machineIdSync({original: true});
app.get("/data", async (request, response) => {
console.log(`request :${JSON.stringify(request.headers, null, 4)}`)
let isSaveDevice = false;
if (request.headers?.deviceid == serverDeviceId) {
isSaveDevice = true;
}
return response.send({
data: 'test data',
callFrom: (isSaveDevice)? 'Same device' : 'Different Device',
callerDeviceId: request.headers?.deviceid,
serverDeviceId: serverDeviceId
})
})
// start express server
app.listen(PORT, () => {
console.log(`Listening on :${PORT}`)
})
客户端.js
const axios = require('axios')
const machineId = require('node-machine-id');
const getData = async () => {
try {
const id = machineId.machineIdSync({original: true});
const resp = await axios.get(
url = 'http://localhost:3000/data',
config = {
headers : {'deviceid': `${id}`}
}
);
console.log(JSON.stringify(resp.data, null, 4));
} catch (err) {
// Handle Error Here
console.error(err);
}
};
getData();
安装依赖项
npm install express cors node-machine-id axios
运行服务器
node server.js
运行客户端
node client.js
客户端结果
$ node client
{
"data": "test data",
"callFrom": "Same device",
"callerDeviceId": "42543e29ccb7471bba0760b328d4a41f",
"serverDeviceId": "42543e29ccb7471bba0760b328d4a41f"
}
服务器端结果
$ node server.js
Listening on :3000
request :{
"accept": "application/json, text/plain, */*",
"deviceid": "42543e29ccb7471bba0760b328d4a41f",
"user-agent": "axios/1.4.0",
"accept-encoding": "gzip, compress, deflate, br",
"host": "localhost:3000",
"connection": "keep-alive"
}