node.js 仅表达与用户相关的 return 个元素
node.js express only return elements related to the user
我只想return属于当前登录用户的交易。我将用户存储在每个请求的 header 中。在每笔交易中,我都存储了创建者。
我的 GET 方法如下所示:
exports.getTrades = (req, res, next) => {
const tradeQuery = Trade.find();
let fetchTrades;
tradeQuery
.then((trades) => {
fetchTrades = trades.filter((t) => t.creator._id === req.userData.userId); <---
return;
})
.then((count) => {
res.status(200).json({
message: "Trades fetched successfully!",
trades: fetchTrades,
});
})
.catch((error) => {
res.status(500).json({
message: "Fetching trades failed!",
});
});
};
我尝试在控制台中手动记录我在过滤器中比较的两个属性,并且实际上存在两者相同的交易。 但是 fetchTrades 仍然是空的。
我真的很感激一些想法。
以下是两个模型:
user.js:
const mongoose = require("mongoose");
const uniqueValidator = require("mongoose-unique-validator");
const userSchema = mongoose.Schema({
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
userSchema.plugin(uniqueValidator);
module.exports = mongoose.model("User", userSchema);
trade.js:
const mongoose = require("mongoose");
const tradeSchema = mongoose.Schema({
pair: { type: String, required: true },
type: { type: String, required: true },
resultAmount: { type: Number, required: true },
date: { type: Date, required: true },
time: { type: Date, required: true },
creator: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true,
},
leverage: { type: Number },
entry: { type: Number },
exit: { type: Number },
lessonLearned: { type: String },
});
module.exports = mongoose.model("Trade", tradeSchema);
编辑:
这就是交易的样子:
{
_id: 6245bf565043276fb456cb6a,
pair: 'BTCUSD',
type: 'long',
resultAmount: 239,
time: 2022-03-22T23:00:00.000Z,
date: 2022-03-31T14:48:28.916Z,
creator: 62409c68e17cae2d68a99b3b,
leverage: 20,
entry: 1.2321,
exit: 1.2377,
lessonLearned: 'I was good man',
__v: 0
}
编辑2:
感谢@vicki。我不得不在我的过滤器函数中使用“==”而不是“===”。
您对过滤功能的使用有误。您 return 没有匹配的条目。
tradeQuery
.then((trades) => {
fetchTrades = trades.filter((t) => t.creator._id === req.userData.userId);
return;
})
这是您的用法。改成
tradeQuery
.then((trades) => {
fetchTrades = trades.filter((t) => return t.creator._id === req.userData.userId);
})
这应该可以解决您的问题。添加一个 js 片段
let trades = [{
"id": 1,
"name": 'asd'
},
{
"id": 2,
"name": 'qwe'
},
{
"id": 1,
"name": 'efg'
}]
let fetchTrades
{
fetchTrades = trades.filter((t) => {
t.id === 1;
return
})
}
console.log('improper usage',fetchTrades)
{
fetchTrades = trades.filter((t) => {
return t.id === 1;
})
}
console.log('Proper usage',fetchTrades)
编辑:
比较 ObjectID 时可能会出现问题,使用 ===
也会进行类型检查。因此,建议使用 t.creator._id.equals(req.userData.userId)
或 ==
。
正如@ApoorvaChikara 指出的那样,不要在过滤器函数中使用 return 语句。
帮助我完成过滤的是 mongoose find() 方法。您可以传入要与用户标识匹配的字段。为了做到这一点,我实现了一个导出所有数据库查询函数的存储库文件。在我的例子中,我想从特定用户那里获取所有时间段。
我的 period.repo.ts 看起来像这样:
// period.repo.ts
import Period from '../models/period.model';
class PeriodRepository {
findAllFromUser(userId: String) {
return Period.find({ userId: userId });
}
}
export default new PeriodRepository();
然后在包含我的后端业务逻辑的服务文件中,我导入并使用 repo 文件,如下所示:
// period.service.ts
import PeriodRepository from './period.repository';
getCycle(req, res) {
let cycleLength = 1;
let lastPeriod;
PeriodRepository.findAllFromUser(req.params.userId)
.then((periods) => {
cycleLength = periodHelper.calcAverageCycleLength(periods, 0);
if (lastPeriod?.endDate) {
return res.status(200).json({
message: 'predictions fetched',
cycleLength: cycleLength,
});
} else {
return res.status(200).json({
message: 'period is active',
remainingDaysPeriod: 0,
remainingDaysOvaluation: 0,
});
}
})
.catch((error) => {
return res.status(500).json({
message: 'fetching periods failed',
});
});
}
这样我只查询属于所选用户的文档。
我只想return属于当前登录用户的交易。我将用户存储在每个请求的 header 中。在每笔交易中,我都存储了创建者。
我的 GET 方法如下所示:
exports.getTrades = (req, res, next) => {
const tradeQuery = Trade.find();
let fetchTrades;
tradeQuery
.then((trades) => {
fetchTrades = trades.filter((t) => t.creator._id === req.userData.userId); <---
return;
})
.then((count) => {
res.status(200).json({
message: "Trades fetched successfully!",
trades: fetchTrades,
});
})
.catch((error) => {
res.status(500).json({
message: "Fetching trades failed!",
});
});
};
我尝试在控制台中手动记录我在过滤器中比较的两个属性,并且实际上存在两者相同的交易。 但是 fetchTrades 仍然是空的。
我真的很感激一些想法。
以下是两个模型:
user.js:
const mongoose = require("mongoose");
const uniqueValidator = require("mongoose-unique-validator");
const userSchema = mongoose.Schema({
email: { type: String, required: true, unique: true },
password: { type: String, required: true },
});
userSchema.plugin(uniqueValidator);
module.exports = mongoose.model("User", userSchema);
trade.js:
const mongoose = require("mongoose");
const tradeSchema = mongoose.Schema({
pair: { type: String, required: true },
type: { type: String, required: true },
resultAmount: { type: Number, required: true },
date: { type: Date, required: true },
time: { type: Date, required: true },
creator: {
type: mongoose.Schema.Types.ObjectId,
ref: "User",
required: true,
},
leverage: { type: Number },
entry: { type: Number },
exit: { type: Number },
lessonLearned: { type: String },
});
module.exports = mongoose.model("Trade", tradeSchema);
编辑: 这就是交易的样子:
{
_id: 6245bf565043276fb456cb6a,
pair: 'BTCUSD',
type: 'long',
resultAmount: 239,
time: 2022-03-22T23:00:00.000Z,
date: 2022-03-31T14:48:28.916Z,
creator: 62409c68e17cae2d68a99b3b,
leverage: 20,
entry: 1.2321,
exit: 1.2377,
lessonLearned: 'I was good man',
__v: 0
}
编辑2: 感谢@vicki。我不得不在我的过滤器函数中使用“==”而不是“===”。
您对过滤功能的使用有误。您 return 没有匹配的条目。
tradeQuery
.then((trades) => {
fetchTrades = trades.filter((t) => t.creator._id === req.userData.userId);
return;
})
这是您的用法。改成
tradeQuery
.then((trades) => {
fetchTrades = trades.filter((t) => return t.creator._id === req.userData.userId);
})
这应该可以解决您的问题。添加一个 js 片段
let trades = [{
"id": 1,
"name": 'asd'
},
{
"id": 2,
"name": 'qwe'
},
{
"id": 1,
"name": 'efg'
}]
let fetchTrades
{
fetchTrades = trades.filter((t) => {
t.id === 1;
return
})
}
console.log('improper usage',fetchTrades)
{
fetchTrades = trades.filter((t) => {
return t.id === 1;
})
}
console.log('Proper usage',fetchTrades)
编辑:
比较 ObjectID 时可能会出现问题,使用 ===
也会进行类型检查。因此,建议使用 t.creator._id.equals(req.userData.userId)
或 ==
。
正如@ApoorvaChikara 指出的那样,不要在过滤器函数中使用 return 语句。
帮助我完成过滤的是 mongoose find() 方法。您可以传入要与用户标识匹配的字段。为了做到这一点,我实现了一个导出所有数据库查询函数的存储库文件。在我的例子中,我想从特定用户那里获取所有时间段。
我的 period.repo.ts 看起来像这样:
// period.repo.ts
import Period from '../models/period.model';
class PeriodRepository {
findAllFromUser(userId: String) {
return Period.find({ userId: userId });
}
}
export default new PeriodRepository();
然后在包含我的后端业务逻辑的服务文件中,我导入并使用 repo 文件,如下所示:
// period.service.ts
import PeriodRepository from './period.repository';
getCycle(req, res) {
let cycleLength = 1;
let lastPeriod;
PeriodRepository.findAllFromUser(req.params.userId)
.then((periods) => {
cycleLength = periodHelper.calcAverageCycleLength(periods, 0);
if (lastPeriod?.endDate) {
return res.status(200).json({
message: 'predictions fetched',
cycleLength: cycleLength,
});
} else {
return res.status(200).json({
message: 'period is active',
remainingDaysPeriod: 0,
remainingDaysOvaluation: 0,
});
}
})
.catch((error) => {
return res.status(500).json({
message: 'fetching periods failed',
});
});
}
这样我只查询属于所选用户的文档。