📌  相关文章
📜  == 操作不适用于 express 中的 id - Javascript (1)

📅  最后修改于: 2023-12-03 14:38:56.007000             🧑  作者: Mango

介绍

Express 是一个非常流行的 Node.js Web 框架,用于构建 Web 应用程序和 API。在使用 Express 过程中,有时会发现通过 ===== 操作比较两个对象的 id 属性会出现问题。

本文将介绍为什么 == 操作不适用于 Express 的 id 属性,并提供一些解决方案。

== 操作的问题

在 Express 中,每个请求(request)对象和响应(response)对象都有一个 id 属性。

const express = require('express');
const app = express();

app.get('/', (req, res) => {
  console.log(req.id); // 请求的 id
  console.log(res.id); // 响应的 id
});

如果你尝试用 ===== 操作比较两个请求的 id,你可能会发现它们不相等,即使它们具有相同的值。这是因为每个请求和响应对象都是 JavaScript 对象,它们具有不同的引用。

const express = require('express');
const app = express();

app.get('/', (req1, res1) => {
  app.get('/', (req2, res2) => {
    console.log(req1.id == req2.id); // false
  })
});

在上述示例中,我们在单个应用程序实例中定义了两个路由。我们在每个路由处理程序中访问请求对象,并尝试比较请求的 id。由于每个请求对象具有不同的引用,因此比较结果为 false,即使它们具有相同的值。

解决方案
使用 === 操作

解决这个问题的第一个解决方案是使用 === 而不是 ==。使用 === 操作比较对象时,只有当对象具有相同的引用时才会返回 true。

const express = require('express');
const app = express();

app.get('/', (req1, res1) => {
  app.get('/', (req2, res2) => {
    console.log(req1.id === req2.id); // false
  })
});
使用不同的 id

另一个解决方案是使用不同的 id 来唯一标识每个请求。您可以使用 uuidshortid 等库来生成唯一的 id。

const express = require('express');
const shortid = require('shortid');
const app = express();

app.get('/', (req, res) => {
  const id = shortid.generate(); // 生成唯一的 id
  console.log(id); // 打印唯一的 id
});
记录 id

还有一个解决方案是在请求处理程序中记录请求的 id,并将其传递给下一个请求处理程序。

const express = require('express');
const app = express();

app.use((req, res, next) => {
  req.id = Date.now().toString(); // 记录请求的 id
  console.log(req.id); // 打印唯一的 id
  next();
});

app.get('/', (req, res) => {
  console.log(req.id); // 打印相同的 id
});

在上述示例中,我们使用中间件在请求处理程序之前记录请求的 id。我们将请求的 id 存储在 req.id 属性中,并在请求处理程序中打印它。由于每个请求都经过这个中间件,它们都具有相同的 id。

结论

在 Express 中,使用 ===== 操作比较请求和响应对象的 id 时可能会导致问题。解决这个问题的方法之一是使用不同的 id 来标识每个请求,另一个方法是记录请求的 id 并将其传递给下一个请求处理程序。